android 预览和拍照成像方向不一致,Android相机预览方向深入探究

原标题:Android相机预览方向深入探究

今日快讯

9月7日,北京市交通委召集各区管理部门和15家共享自行车企业负责人,听取共享自行车投放和管理的意见建议,研究决定并下发通知,暂停在本市新增投放共享自行车。摩拜单车和ofo小黄车表示对于北京市交通委提出的加强共享单车管理、维护市容市貌的举措表示积极拥护和全力支持。

作者简介

转眼来到了周五,祝大家周末愉快!

本篇来自 IT小蔡的投稿,分享了 Android 相机预览方向相关的内容,希望大家喜欢!

IT小蔡的博客地址:

http://blog.csdn.net/cai784921129

前言

以前对 Camera 了解的不是太深入,最近有需求把人脸识别 集成到项目,必然会与 Camera打交道,遇到一些坑,与大家分享一下。

预览方向

首先理解一下 info.orientation 官方解释

官方定义:orientation 表示相机图像的方向。它的值是相机图像顺时针旋转到设备自然方向一致时的角度。例如假设设备是竖屏的。后置相机传感器是横屏安装的。当你面向屏幕时,如果后置相机传感器顶边的和设备自然方向的右边是平行的,则后置相机的 orientation 是 90。如果前置相机传感器顶边和设备自然方向的右边是平行的,则前置相机的 orientation 是 270。

画了一个简单的草图,我用两部手机进行测试,一部是华为荣耀 6plus 、另一个是定做的 T6A,测试的时候把手机固定为了竖屏应用

android 预览和拍照成像方向不一致,Android相机预览方向深入探究_第1张图片

另一款 Android 机 T6A ,摄像头位置比较特别,我获取的 info.orientation = 0; 那意味着我不用旋转,捕获的数据,都是与屏幕方向一致的

特别说明:

对于后置相机,只需要旋转后置相机的 orientation 即 90即可和屏幕方向保持一致;

对于前置相机的预览方向,相机预览的图像是相机采集到的图像的镜像,由于系统对前置相机采集到的图像做了镜像,因此需要旋转 270-180,也是 90 度才可与屏幕方向保持一

setDisplayOrientation(int degrees)

这个API修改的仅仅是 Camera 的预览方向而已,并不会影响到 PreviewCallback 回调、生成的 JPEG 图片和录像文件的方向,这些数据的方向依然会跟图像 Sensor 的方向一致。

官方推荐预览方向写法

android 预览和拍照成像方向不一致,Android相机预览方向深入探究_第2张图片

调用 this.getWindowManager().getDefaultDisplay().getRotation();

该函数的返回值,有如下四种:

Surface.ROTATION_0

Surface.ROTATION_90

Surface.ROTATION_180

Surface.ROTATION_270

其中,Surface.ROTATION_0 表示的是手机竖屏方向向上,后面几个以此为基准依次以顺时针 90 度递增。

拍照方向

Camera 的拍照方向:当你点击拍照按钮,得到的图片方向不一定与画面中预览的方向一致,这是因为拍摄的照片是将图像 Sensor 采集到的数据直接存储到 SDCard 上的,因此,Camera 的拍照方向与上述的 Camera 的采集图像方向一致。

第一种做法

rotation 可由上面获取的预览方向获取,注意前置摄像头要翻转180度。

parameters.setRotation(rotation); //设置 rotation 旋转角度到 Camera 的参数parameters。这个旋转角度最后会写到 exif 信息中去 。

第二种做法

通过 ExifInterface,去获取图片Orientation 方向 ,然后旋转合适的角度,去展示

读取旋转的图片属性

android 预览和拍照成像方向不一致,Android相机预览方向深入探究_第3张图片

将图片按照某个角度进行旋转

android 预览和拍照成像方向不一致,Android相机预览方向深入探究_第4张图片

责任编辑:

你可能感兴趣的:(android,预览和拍照成像方向不一致)