活动固定为纵向时旋转生成的相机图像

时间:2013-01-30 19:46:24

标签: android android-camera android-orientation

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

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

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

1 个答案:

答案 0 :(得分: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。如果您发现自己的预览未在用户界面中正确定位,则需要为此调用setDisplayOrientation。相机传感器通常与设备的横向方向对齐,因此风景相机应用程序通常可以在不调用此功能的情况下离开,即使它们应该是在一个不寻常的Android设备上。但是,如果您正在编写纵向应用程序,则可能必须调整显示方向以与UI对齐。与setRotation一样,您需要考虑一些因素,并且文档中包含用于正确计算数学的示例代码。