当 Activity 固定为纵向时旋转生成的相机图像

Posted

技术标签:

【中文标题】当 Activity 固定为纵向时旋转生成的相机图像【英文标题】:Rotate resulting Camera Images when the Activity is fixed to portrait 【发布时间】:2013-01-14 18:19:06 【问题描述】:

我正在使用内置摄像头制作应用程序。 Activity 固定为纵向,但我希望将图像正确保存为正面朝上,如下所示:

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】:

如果您只是想旋转通过调用 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 一样,您需要考虑一些因素,文档中包含用于正确计算数学的示例代码。

【讨论】:

我想出了一个解决方案,但我需要支持 API 8 及更高版本。这涵盖了 9 岁及以上。有什么建议吗? 经过研究,我似乎没有 Froyo 的替代品。不过没关系。这已经足够了。谢谢!

以上是关于当 Activity 固定为纵向时旋转生成的相机图像的主要内容,如果未能解决你的问题,请参考以下文章

Android上捕获的视频不会旋转到纵向

如何仅旋转子类 mpmovieplayer 控制器并将其他视图固定为纵向

相机应用程序支持的方向?

相机预览处于纵向模式,但拍摄的图像已旋转

将 ipad 从纵向旋转到横向时,Div 保持相同的宽度

仅支持纵向界面时如何保存相机图像