当 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 固定为纵向时旋转生成的相机图像的主要内容,如果未能解决你的问题,请参考以下文章