Improved QR code recognition when screen and camera orientation don't match
This commit is contained in:
parent
2d59a99833
commit
b249c1f36f
|
@ -85,22 +85,38 @@ public final class CameraManager {
|
||||||
|
|
||||||
camera.setPreviewTexture(textureView.getSurfaceTexture());
|
camera.setPreviewTexture(textureView.getSurfaceTexture());
|
||||||
|
|
||||||
final Camera.Parameters parameters = camera.getParameters();
|
|
||||||
|
|
||||||
cameraResolution = findBestPreviewSizeValue(parameters, textureView.getWidth(), textureView.getHeight());
|
|
||||||
|
|
||||||
final int width = textureView.getWidth();
|
final int width = textureView.getWidth();
|
||||||
final int height = textureView.getHeight();
|
final int height = textureView.getHeight();
|
||||||
|
|
||||||
|
final Camera.Parameters parameters = camera.getParameters();
|
||||||
|
|
||||||
|
cameraResolution = findBestPreviewSizeValue(parameters, width, height);
|
||||||
|
|
||||||
final int rawSize = Math.min(width * 2 / 3, height * 2 / 3);
|
final int rawSize = Math.min(width * 2 / 3, height * 2 / 3);
|
||||||
final int frameSize = Math.max(MIN_FRAME_SIZE, Math.min(MAX_FRAME_SIZE, rawSize));
|
final int frameSize = Math.max(MIN_FRAME_SIZE, Math.min(MAX_FRAME_SIZE, rawSize));
|
||||||
|
|
||||||
final int leftOffset = (width - frameSize) / 2;
|
final int leftOffset = (width - frameSize) / 2;
|
||||||
final int topOffset = (height - frameSize) / 2;
|
final int topOffset = (height - frameSize) / 2;
|
||||||
frame = new Rect(leftOffset, topOffset, leftOffset + frameSize, topOffset + frameSize);
|
frame = new Rect(leftOffset, topOffset, leftOffset + frameSize, topOffset + frameSize);
|
||||||
framePreview = new RectF(frame.left * cameraResolution.width / width,
|
|
||||||
frame.top * cameraResolution.height / height, frame.right * cameraResolution.width / width,
|
float widthFactor;
|
||||||
frame.bottom * cameraResolution.height / height);
|
float heightFactor;
|
||||||
|
Rect orientedFrame;
|
||||||
|
boolean isTexturePortrait = width < height;
|
||||||
|
boolean isCameraPortrait = cameraResolution.width < cameraResolution.height;
|
||||||
|
if (isTexturePortrait == isCameraPortrait) {
|
||||||
|
widthFactor = (float)cameraResolution.width / width;
|
||||||
|
heightFactor = (float)cameraResolution.height / height;
|
||||||
|
orientedFrame = new Rect(frame);
|
||||||
|
} else {
|
||||||
|
widthFactor = (float)cameraResolution.width / height;
|
||||||
|
heightFactor = (float)cameraResolution.height / width;
|
||||||
|
// Swap X and Y coordinates to flip frame to the same orientation as cameraResolution
|
||||||
|
orientedFrame = new Rect(frame.top, frame.left, frame.bottom, frame.right);
|
||||||
|
}
|
||||||
|
|
||||||
|
framePreview = new RectF(orientedFrame.left * widthFactor, orientedFrame.top * heightFactor,
|
||||||
|
orientedFrame.right * widthFactor, orientedFrame.bottom * heightFactor);
|
||||||
|
|
||||||
final String savedParameters = parameters == null ? null : parameters.flatten();
|
final String savedParameters = parameters == null ? null : parameters.flatten();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue