【问题标题】:Android Camera Rotation GenericAndroid 相机旋转通用
【发布时间】:2015-05-29 06:49:12
【问题描述】:

我试图在设备旋转时旋转我的相机,我尝试了几种方法,但似乎没有一种方法适用于所有设备。

//这适用于我的nexus 5,但不适用于我的三星galaxy标签

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
{
    if (mHolder.getSurface() == null)
    {
      return;
    }

    try
    {
        mCamera.stopPreview();

        Camera.Parameters parameters = mCamera.getParameters();
        parameters.set("orientation", "landscape");
        int rotation = ((WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation();

        int orientation = getContext().getResources().getConfiguration().orientation;

        if (rotation == Surface.ROTATION_0) {
            if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
                mCamera.setDisplayOrientation(0);
            } else {
                mCamera.setDisplayOrientation(90);
            }
        }
        else if (rotation == Surface.ROTATION_90) {
            if (orientation == Configuration.ORIENTATION_PORTRAIT) {
                mCamera.setDisplayOrientation(270);
            }
        }
        else if (rotation == Surface.ROTATION_180) {
            if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
                mCamera.setDisplayOrientation(180);
            }
        }
        else if (rotation == Surface.ROTATION_270) {
            if (orientation == Configuration.ORIENTATION_PORTRAIT) {
                mCamera.setDisplayOrientation(90);
            }
        }

        mCamera.setPreviewDisplay(holder);
        mCamera.startPreview();
    }
    catch (Exception e) {
    }
}

// 我试过了,这是文档的一部分,它在我的 nexus 5 上不起作用:

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);
 }

有人有适用于所有设备的有效解决方案吗?

【问题讨论】:

  • “它不起作用”到底是什么意思?你输出的图像是旋转的?
  • 相机旋转不正确。抱歉,如果我的问题不清楚。

标签: android camera rotation orientation


【解决方案1】:

虽然我不太确定您提供的代码有什么问题,但在 Android 上使用相机 API 和图像旋转时必须做的几件事(旧的 - 关于 API

1.您必须考虑到图像传感器的orientation

传感器的方向是指它与设备原生使用模式的角度。 (这就是您正在使用的 google sn-p 的实际作用)对于手机,这通常设置为纵向,在平板电脑上设置为横向。 这是文档的摘录,它可能会让人头疼一段时间,但事情就是这样。

例如,假设设备具有自然高的屏幕。后置摄像头传感器横向安装。你正在看屏幕。如果摄像头传感器的顶部在自然方向与屏幕右边缘对齐,则该值应为 90。如果前置摄像头传感器的顶部与屏幕右侧对齐,该值应是 270。

2。前置摄像头预览正在镜像

如果您使用前置摄像头,则必须考虑隐式镜像。

3.这些规则仅用于旋转相机预览

这很重要。所有这些只是为了让您在设备屏幕上显示正确旋转的预览帧。拍摄实际照片后,您必须再次旋转它以满足您的需要。对于正面图像,这可能意味着您自己进行镜像,...您可以在 Android 上的所有应用程序中看到这种“怪异”的结果。只需在环聊中拍照并立即分享。结果,在各种手机上,您必须得到一些奇怪的旋转图像。

4. OEM 并非始终遵守规范

我只能说,可能没有解决方案是无忧无虑的,我们在某些特定设备上遇到了一些问题。 (像往常一样在 Android 上:)

5.使用 CWAC 相机库

我们发现this library 是官方相机 API 的出色包装器。几乎解决了我提到的所有问题。

【讨论】:

  • 嗨,感谢您提供的所有见解,我明白他们为什么要制作新的相机 API。我不会使用该库,但它是一个有用的参考。
  • ..回到您的问题..您对预览或生成的图像有疑问?正如你所看到的,这是两个不同的东西。
  • 我的问题是预览,我真的不打算拍照。我只需要预览
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多