设置正确的方向以预览相机和最终结果图像

时间:2014-05-15 08:00:43

标签: android android-camera

我正在开发我的自定义相机应用程序,我遇到了方向问题。

当手机处于纵向时,预览屏幕和结果图像以横向显示

enter image description here

当手机处于左横向时,预览屏幕和结果图像显示正确

enter image description here

当手机处于正确的横向方向时,预览屏幕和结果图像以横向模式显示,但垂直翻转

enter image description here

我读过有关使用setDisplayorientation更改方向但我没有设法解决它。

有人可以帮助我吗?

感谢您的帮助

这是开始预览的相机活动代码

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        // TODO Auto-generated method stub
        System.out.println("!!!!!!!CAMBIO!!!!!!!!" );
        initPreview(width, height);
        startPreview();
    }


    private void initPreview(int width, int height) {
        if (myCamera!=null && mySurfaceHolder.getSurface()!=null) {
            try {
                myCamera.setPreviewDisplay(mySurfaceHolder);
            }
            catch (Throwable t) {
                Log.e("PreviewDemo-surfaceCallback",
                        "Exception in setPreviewDisplay()", t);
                Toast
                .makeText(CameraHandler.this, t.getMessage(), Toast.LENGTH_LONG)
                .show();
            }

            if (!cameraConfigured) {
                Camera.Parameters parameters=myCamera.getParameters();
                Camera.Size size=getBestPreviewSize(width, height,
                        parameters);

                if (size!=null) {

                    parameters.setPreviewSize(size.width, size.height);

                    myCamera.setParameters(parameters);
                    cameraConfigured=true;
                }
            }
        }
    }

    private void startPreview() {
        if (cameraConfigured && myCamera!=null) {
            myCamera.startPreview();
            inPreview=true;
        }
    }

private Camera.Size getBestPreviewSize(int width, int height,  Camera.Parameters parameters) {

        Camera.Size result=null;

        for (Camera.Size size : parameters.getSupportedPreviewSizes()) {
            System.out.println("Soportados " + size.width + "x" + size.height);
            if (size.width<=width && size.height<=height) {
                if (result==null) {
                    result=size;
                }
                else {
                    int resultArea=result.width*result.height;
                    int newArea=size.width*size.height;

                    if (newArea>resultArea) {
                        result=size;
                    }
                }
            }
        }

        return(result);
    }

1 个答案:

答案 0 :(得分:2)

setDisplayorientation()的代码示例位于主文档中:

  

如果要使摄像机图像显示方向相同   显示,您可以使用以下代码。

 public static void setCameraDisplayOrientation(Activity activity,
         int cameraId, android.hardware.Camera camera) {
     android.hardware.Camera.CameraInfo info =
             new android.hardware.Camera.CameraInfo();
     android.hardware.Camera.getCameraInfo(cameraId, info);
     int rotation = activity.getWindowManager().getDefaultDisplay()
             .getRotation();
     int degrees = 0;
     switch (rotation) {
         case Surface.ROTATION_0: degrees = 0; break;
         case Surface.ROTATION_90: degrees = 90; break;
         case Surface.ROTATION_180: degrees = 180; break;
         case Surface.ROTATION_270: degrees = 270; break;
     }

     int result;
     if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
         result = (info.orientation + degrees) % 360;
         result = (360 - result) % 360;  // compensate the mirror
     } else {  // back-facing
         result = (info.orientation - degrees + 360) % 360;
     }
     camera.setDisplayOrientation(result);
 }
  

从API级别14开始,可以在预览时调用此方法   很活跃。

这不适用于使用Camera.takePicture()拍摄的照片。为此,您可以使用Camera.Parameters.setRotation()。不幸的是,有些设备只根据这个设置EXIF旋转标志,更不幸的是,一些流行的图像浏览器忽略了这个标志。在这种情况下,您必须自己旋转生成的JPEG。为此,您可以使用Java MediaUtil库,例如https://stackoverflow.com/a/15302674/192373