1

我正在使用内置相机制作应用程序。活动固定为纵向,但我希望将图像正确保存在右侧,如下所示:

Camera camera = getCameraInstance(); //method found on http://developer.android.com/guide/topics/media/camera.html
Camera.Parameters params = camera.getParameters();
params.setRotation(someInteger); //I want to get the proper value for this method
camera.setParameters(params);

有没有人能够做到这一点?

4

1 回答 1

3

如果您只是想旋转通过调用 takePicture 接收到的 JPEG 图像,那么 setRotation 是正确的使用方法。

关于将什么值传递给 setRotation 的问题是什么?假设您希望真实世界的“向上”在保存的 JPEG 图像中“向上”,则需要根据相机传感器相对于世界的当前方向设置 setRotate。

您可以找出整个设备与世界的相对方向是什么,您可以找出相机传感器的方向相对于设备的“自然”方向是什么,并将这两个旋转组合成最终答案。数学很容易出错,这就是为什么我们在setRotation的 API 文档中明确说明了它,在此处复制:

public void onOrientationChanged(int orientation) {
   if (orientation == ORIENTATION_UNKNOWNsetRotation) return;
   android.hardware.Camera.CameraInfo info =
        new android.hardware.Camera.CameraInfo();
   android.hardware.Camera.getCameraInfo(cameraId, info);
   orientation = (orientation + 45) / 90 * 90;
   int rotation = 0;
   if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {
     rotation = (info.orientation - orientation + 360) % 360;
   } else {  // back-facing camera
     rotation = (info.orientation + orientation) % 360;
   }
   mParameters.setRotation(rotation);
}

您需要从OrientationEventListener继承并为回调方法实现上述内容。当然,在更新参数之前,您应该检查您的相机是否已打开,并且 mParameters 等是否有效。

请注意,这只会旋转相机发出的 JPEG。如果您发现您的预览在您的 UI 中的方向不正确,您需要为此调用setDisplayOrientation。相机传感器通常与设备的横向对齐,因此横向相机应用程序通常可以在不调用此函数的情况下逃脱,即使它们应该在不寻常的 Android 设备上使用。但是,如果您正在编写纵向应用程序,则可能必须调整显示方向以与您的 UI 对齐。与 setRotation 一样,您需要考虑一些因素,文档中包含用于正确计算数学的示例代码。

于 2013-01-30T20:00:19.183 回答