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 New Issue