1、概念解释 。
“自然方向”:指当宽比高短时 , 我们看到的手机的方向(竖屏) , 就是自然方向 。
2、相机图像传感器采集图像的方向 。
由于手机拍摄到的图片来自相机的图像传感器 , 而相机是固定到手机上的 , 所以相机的图像传感器的图像采集方向就固定住了 。因此只能对采集后的图片数据进行旋转以便得到正确的预览 。在自然方向进行前后摄像头拍照 , 未进行任何旋转得到的图片如下:
前摄像头:
后摄像头:
以上图片是在手机“自然方向”获取得 , 在手机屏幕其他方向时 , 该图片也会变化 。
3、图像校正 , 进行预览旋转 。
我们可以通过对象的属性获取图像传感器的图像采集方向 , 该属性是一个角度值 , 只能有0 , 90 , 180 , 270四个中的一个 , 这几个角度值是相对于手机的“自然方向”来说的 。再直白点就是 , 相机所采集的图像只要按着该角度顺时针旋转就可以得到正确的预览图像数据 。
然后通过的n方法改变预览方向(顺时针旋转) 。后置摄像头为90 , 前置摄像头的通常为270 。所以 , 当是后置摄像头时 , (90)即可将预览图像校正 , 及顺时针旋转90 。而当是前置摄像头时 , 设置270就不行了 , 因为前置摄像头会在旋转预览方向之前 , 对预览方向来一个水平翻转 , 所以设置值应该是90 , 及顺时针旋转90 。
4、图解演示旋转过程 。
(1)手机自然方向如下:
(2)后置摄像头传感器采集的图像如下:
所以只要顺时针旋转90度即可 。
(3)前置摄像头传感器采集的图像如下:
接下来进行旋转校正
5、根据相机情况与屏幕情况进行计算得到最终 , 用于预览校正 。
public void setCameraDisplayOrientationNew(Activity activity){Camera.CameraInfo cameraInfo=new Camera.CameraInfo();Camera.getCameraInfo(CameraId,cameraInfo);//当前屏幕的方向 , 0为自然方向 , 1为顺时针旋转90 , 2为顺时针180 , 3为顺时针270int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();int degree=0;//当前手机顺时针旋转的角度switch (rotation){case Surface.ROTATION_0:degree=0;break;case Surface.ROTATION_90:degree=90;break;case Surface.ROTATION_180:degree=180;break;case Surface.ROTATION_270:degree=270;break;}int result;if(cameraInfo.facing== Camera.CameraInfo.CAMERA_FACING_FRONT){//前置//前置摄像头会进行水平镜像旋转(逆时针旋转180)result= (cameraInfo.orientation + 180-degree)%360;}else{//后置摄像头无需水平翻转 , 直接是差值result = (cameraInfo.orientation - degree +360 )%360;}mCamera.setDisplayOrientation(result);}
6、上面的算法 , 也或许看不懂 , 没关系 , 接下来详细介绍一下用到的各个方向 。
(1)、的
在中 , 提供了一个接口 , 可以获取当前手机的旋转角度 。
getWindowManager().getDefaultDisplay().getRotation();
这个接口返回的值主要有如下4个:
. ,
. ,
. ,
.
依次代表手机的方向如下:
对于 , 默认的手机方向时:竖屏Home键在下面 , 这个方向是的0度方向 。
注意:它的角度规律是:“逆时针”方向旋转递增 , 每次递增90度 。
(2)、传感器得到的屏幕方向
- 初二上册物理知识点总结
- Android第二单元总结
- 界面设计的行业标准总结一
- Postman接口测试实践总结
- 如何判断声音的方向
- 八十 C语言之pthread_cond_t信号变化探究总结
- 使用TX2读取USB手柄/方向盘的输出控制
- 一 项目目录实践总结
- 一 SpringBoot框架技术总结
- 密码学技术总结