Android how to fix camera orientation

前端 未结 4 1110
滥情空心
滥情空心 2020-12-13 13:52

Notice how the view of the camera (NOT THE CAPTURED IMAGE) was flipped to left (image above), the or

相关标签:
4条回答
  • 2020-12-13 14:31

    This problem was solved a long time ago but I encountered some difficulties to put all pieces together so here is my final solution, I hope this will help others :

    public void startPreview() {
            try {
                Log.i(TAG, "starting preview: " + started);
    
                // ....
                Camera.CameraInfo camInfo = new Camera.CameraInfo();
                Camera.getCameraInfo(cameraIndex, camInfo);
                int cameraRotationOffset = camInfo.orientation;
                // ...
    
                Camera.Parameters parameters = camera.getParameters();
                List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes();
                Camera.Size previewSize = null;
                float closestRatio = Float.MAX_VALUE;
    
                int targetPreviewWidth = isLandscape() ? getWidth() : getHeight();
                int targetPreviewHeight = isLandscape() ? getHeight() : getWidth();
                float targetRatio = targetPreviewWidth / (float) targetPreviewHeight;
    
                Log.v(TAG, "target size: " + targetPreviewWidth + " / " + targetPreviewHeight + " ratio:" + targetRatio);
                for (Camera.Size candidateSize : previewSizes) {
                    float whRatio = candidateSize.width / (float) candidateSize.height;
                    if (previewSize == null || Math.abs(targetRatio - whRatio) < Math.abs(targetRatio - closestRatio)) {
                        closestRatio = whRatio;
                        previewSize = candidateSize;
                    }
                }
    
                int rotation = getWindowManager().getDefaultDisplay().getRotation();
                int degrees = 0;
                switch (rotation) {
                case Surface.ROTATION_0:
                    degrees = 0;
                    break; // Natural orientation
                case Surface.ROTATION_90:
                    degrees = 90;
                    break; // Landscape left
                case Surface.ROTATION_180:
                    degrees = 180;
                    break;// Upside down
                case Surface.ROTATION_270:
                    degrees = 270;
                    break;// Landscape right
                }
                int displayRotation;
                if (isFrontFacingCam) {
                    displayRotation = (cameraRotationOffset + degrees) % 360;
                    displayRotation = (360 - displayRotation) % 360; // compensate
                                                                        // the
                                                                        // mirror
                } else { // back-facing
                    displayRotation = (cameraRotationOffset - degrees + 360) % 360;
                }
    
                Log.v(TAG, "rotation cam / phone = displayRotation: " + cameraRotationOffset + " / " + degrees + " = "
                        + displayRotation);
    
                this.camera.setDisplayOrientation(displayRotation);
    
                int rotate;
                if (isFrontFacingCam) {
                    rotate = (360 + cameraRotationOffset + degrees) % 360;
                } else {
                    rotate = (360 + cameraRotationOffset - degrees) % 360;
                }
    
                Log.v(TAG, "screenshot rotation: " + cameraRotationOffset + " / " + degrees + " = " + rotate);
    
                Log.v(TAG, "preview size: " + previewSize.width + " / " + previewSize.height);
                parameters.setPreviewSize(previewSize.width, previewSize.height);
                parameters.setRotation(rotate);
                camera.setParameters(parameters);
                camera.setPreviewDisplay(mHolder);
                camera.startPreview();
    
                Log.d(TAG, "preview started");
    
                started = true;
            } catch (IOException e) {
                Log.d(TAG, "Error setting camera preview: " + e.getMessage());
            }
        }
    
    0 讨论(0)
  • 2020-12-13 14:33

    There is a property in class Camera.CameraInfo named as orientation. It returns the integer. You can get the current orientation and then changed accordingly.

    See this answer for handling orientation and CameraInfo class.

    I am sure this will help you.

    0 讨论(0)
  • 2020-12-13 14:36

    I found the solution here. Answer by @Ed Jellard.

    i just have to add camera.setDisplayOrientation(90); on surfaceCreated(SurfaceHolder holder) method, now the display is on the right angle.

    see the happy T-REX :)

    0 讨论(0)
  • 2020-12-13 14:45

    Camera rotates automatically when you rotate your phone, However if you want the image captured by camera or from gallery to be in the right orientation, use this :-

    public void rotate(String filePath){
                  Bitmap cameraBitmap = null;
                BitmapFactory.Options bmOptions = new BitmapFactory.Options();
                bmOptions.inJustDecodeBounds = false;
                bmOptions.inPurgeable = true;
                bmOptions.inBitmap = cameraBitmap; 
                bmOptions.inMutable = true; 
    
            cameraBitmap = BitmapFactory.decodeFile(filePath,bmOptions); 
            // Your image file path
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                cameraBitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
    
    
            ExifInterface exif = new ExifInterface(filePath);
            float rotation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);  
            System.out.println(rotation);
    
            float rotationInDegrees = exifToDegrees(rotation);
            System.out.println(rotationInDegrees);
    
            Matrix matrix = new Matrix();
            matrix.postRotate(rotationInDegrees);
    
            Bitmap rotatedBitmap = Bitmap.createBitmap(cameraBitmap , 0, 0, cameraBitmap.getWidth(), cameraBitmap.getHeight(), matrix, true);
            FileOutputStream fos=new FileOutputStream(filePath);
            rotatedBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
            fos.write(bos.toByteArray());
            cameraBitmap.recycle();
            System.gc();
            fos.flush();
            fos.close();
    }
    
    private static float exifToDegrees(float exifOrientation) {        
        if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_90) { return 90; } 
        else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_180) {  return 180; } 
        else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_270) {  return 270; }            
        return 0;    
    } 
    
    0 讨论(0)
提交回复
热议问题