Android|Android 手机横向后,后置预览跟着翻转

【声明:】本文是作者(蘑菇v5)原创,版权归作者 蘑菇v5所有,侵权必究。本文首发在。如若转发,请注明作者和来源地址!未经授权,严禁私自转载!
前言:
最近在做人体识别的项目,涉及到相机的一些问题,在 Camera进行开发时,Camera的预览方向和拍照方向非常重要,当手机横向时,预览却不变,导致给人的感觉很不好。本文就是解决这个问题的,随着手机横向,翻转预览的方向。
我们知道手机Camera的图像数据都是来自于摄像头硬件的图像传感器(Image Sensor),这个Sensor被固定到手机之后是有一个默认的取景方向的,这个方向如下图所示,坐标原点位于手机横放时的左上角:
Android|Android 手机横向后,后置预览跟着翻转
文章图片
图1 Camera 预览方向
由于手机屏幕可以 360 度旋转,为了保证用户无论怎么旋转手机都能看到“正确”的预览画面。Android系统底层根据当前手机屏幕的方向对图像Sensor 采集到的数据进行了旋转处理后才传输给显示系统。因此,你在打开Camera应用后,无论怎么旋转手机都能看到“正确”的画面。
这里的“正确”是指显示在预览界面的画面与你人眼看到的眼前的画面是一致的
Android系统提供一个API 来手动设置Camera 的预览方向,叫 setDisplayOrientation。默认情况下这个值是0,与图像 Sensor方向一致,所以对于横屏应用来说就不需要更改这个 Camera预览方向。
但是,如果你的应用是竖屏应用,就必须通过这个 APICamera的预览方向旋转 90 度,让摄像头预览方向与手机屏幕方向保持一致,这样才会得到正确的预览画面。
Camera 拍照方向
当你点击拍照按钮,得到的图片方向不一定与画面中的预览方向一致,这是因为拍摄的照片是将图像 Sensor采集到的数据直接存储到SDCard 上的,因此 Camera的拍照方向与图像 Sensor方向一致。
如果横向拿手机拍照,由于正好与 Camera的拍照方向一致,因此得到的照片是“正确”的;而竖着拿手机拍照的话,图像 Sensor依然以上面描述的角度在采集图像后存储到 SDCard上,所以得到的图片因为竖着拿手机正好与图像Sensor的方向相差了 90 度。由此,大家应该明白了为什么我们用手机拍出的照片经常需要旋转 90 度才能看到“正确”的画面了吧?
我想上面的介绍应该已经把这个问题讲清楚了,下面介绍一下实际开发中要如何使用设置Camera 预览方向的 setDisplayOrientation方法。
实际使用
根据上面的分析,对于横屏应用拍摄时不需要额外设置这个方向,但是对于竖屏应用,则需要调用 setDisplayOrientation(90)来保证Camera 的预览方向与 Activity的方向一致,那么设置了这个函数究竟会不会影响到 Camera拍照的结果呢。
根据上面的分析,理论上应该是不影响的,因为拍照得到的图片方向是与图像 Sensor的方向一致的。这个 API修改的仅仅是 Camera的预览方向而已,并不会影响到 PreviewCallback回调、生成的 JPEG图片和录像文件的方向,这些数据的方向依然会跟图像 Sensor的方向一致。
【Android|Android 手机横向后,后置预览跟着翻转】当然要处理 Camera方向不可能通过一个简单的 setDisplayOrientation(90) 就能搞定所有问题。比如前置摄像头的话预览要水平翻转才行,同样的情况下你可能要 setDisplayOrientation(270) 。具体的可参考官方文档的建议进行处理:
Android|Android 手机横向后,后置预览跟着翻转
文章图片
图2 Android|Android 手机横向后,后置预览跟着翻转
文章图片
图3 Android|Android 手机横向后,后置预览跟着翻转
文章图片
图4

    推荐阅读