<font color = 'gray'>2018-11-08 编辑 :yzl </font>
方式 | 时间 | 人物 |
---|---|---|
制定 | 20181108 | 杨志灵 |
修改 | 20181109 | 杨志灵 |
前言
在引用第三方库LLSimplCamera时,发现一个问题就是,界面不支持横竖屏,当横屏进入到拍摄界面时,拍摄到的图片方向不对,为解决此问题,需求修改源码,在此之前得了解显示层设置的方向与设备方向到底是如何的一种关系时,才能让显示的图片与我们实际看的图片一致;还有输入出流程的方向与设备方向到底是如何一种关系时,才能得到正确的图片。本文是通过数据统计,看出他们的关系,并且得出结论。
显示层与拍摄方向的关系
设备不支持旋转
一、 设备只支持竖屏
1.显示层方向与拍摄方向关系
captureVideoPreviewLayer.connection.videoOrientation | 拍摄时手机方向 | 显示层图片显示方向 |
---|---|---|
AVCaptureVideoOrientationLandscapeRight | up | left |
right | left | |
left | left | |
AVCaptureVideoOrientationPortrait | up | up |
right | up | |
left | up | |
AVCaptureVideoOrientationLandscapeLeft | up | right |
right | right | |
left | right |
结论当屏只支持竖屏时,只有显示层方向为AVCaptureVideoOrientationPortrait(与状态栏方向一致)时,显示的图片才正确。
2.输出流方向与图片方向关系
AVCaptureStillImageOutput的connection.videoOrientation | 拍摄时手机方向 | 图片实际方向 | UIImage属性imageOrientation值 |
---|---|---|---|
<font color=red>AVCaptureVideoOrientationLandscapeRight <font> | up | left | 0 |
<font color=red> right<font> | <font color=red>up </font> | <font color=red>0 <font> | |
left | down | 0 | |
<font color=red>AVCaptureVideoOrientationPortrait</font> | <font color=red>up</font> | <font color=red>left</font> | <font color=red>3</font> |
right | up | 3 | |
left | down | 3 | |
<font color=red>AVCaptureVideoOrientationLandscapeLeft</font> | up | left | 1 |
right | up | 1 | |
<font color=red>left</font> | <font color=red>down </font> | <font color=red>1</font> |
只有图片实际方向与UIImage属性imageOrientation值方向一致时,通过方向纠正,才能得到正确图片,所以上面标红的数据才是我们想要的。所以从上面数据得出结论只有拍摄方向(这里我们可以认为是设备方向)与输入流设置的方向一致时,才能得到正确的图片方向(这里的正确指的是与我们肉眼实际看到的图片一致)。
二、设备只支持UIDeviceOrientationLandscapeRight
1.显示层方向与拍摄方向关系
captureVideoPreviewLayer.connection.videoOrientation | 拍摄时手机方向 | 显示层图片显示方向 |
---|---|---|
AVCaptureVideoOrientationLandscapeRight | up | up |
right | up | |
left | up | |
AVCaptureVideoOrientationPortrait | up | right |
right | right | |
left | right | |
AVCaptureVideoOrientationLandscapeLeft | up | down |
right | down | |
left | down |
结论当屏只支持UIDeviceOrientationLandscapeRight时,只有显示层方向为AVCaptureVideoOrientationLandscapeRight(与状态栏方向一致)时,显示的图片才正确。
2.输出流方向与图片方向关系
AVCaptureStillImageOutput的connection.videoOrientation | 拍摄时手机方向 | 图片实际方向 | UIImage属性imageOrientation值 |
---|---|---|---|
AVCaptureVideoOrientationLandscapeRight | up | left | 0 |
right | up | 0 | |
left | down | 0 | |
AVCaptureVideoOrientationPortrait | up | left | 3 |
right | up | 3 | |
left | down | 3 | |
AVCaptureVideoOrientationLandscapeLeft | up | left | 1 |
right | up | 1 | |
left | down | 1 |
同样得出结论:只有拍摄方向(这里我们可以认为是设备方向)与输入流设置的方向一致时,才能得到正确的图片方向(这里的正确指的是与我们肉眼实际看到的图片一致)
三、 设备只支持UIDeviceOrientationLandscapeLeft
1.显示层方向与拍摄方向关系
captureVideoPreviewLayer.connection.videoOrientation | 拍摄时手机方向 | 显示层图片显示方向 |
---|---|---|
AVCaptureVideoOrientationLandscapeRight | up | down |
right | down | |
left | down | |
AVCaptureVideoOrientationPortrait | up | left |
right | left | |
left | left | |
AVCaptureVideoOrientationLandscapeLeft | up | up |
right | up | |
left | up |
结论当屏只支持UIDeviceOrientationLandscapeLeft时,只有显示层方向为AVCaptureVideoOrientationLandscapeLeft(与状态栏方向一致)时,显示的图片才正确。
2.输出流方向与图片方向关系
AVCaptureStillImageOutput的connection.videoOrientation | 拍摄时手机方向 | 图片实际方向 | UIImage属性imageOrientation值 |
---|---|---|---|
AVCaptureVideoOrientationLandscapeRight | up | left | 0 |
right | up | 0 | |
left | down | 0 | |
AVCaptureVideoOrientationPortrait | up | left | 3 |
right | up | 3 | |
left | down | 3 | |
AVCaptureVideoOrientationLandscapeLeft | up | left | 1 |
right | up | 1 | |
left | down | 1 |
同样得出结论:只有拍摄方向(这里我们可以认为是设备方向)与输入流设置的方向一致时,才能得到正确的图片方向(这里的正确指的是与我们肉眼实际看到的图片一致)。
四、 设备只支持UIDeviceOrientationDown
由于数据统计整理起来太麻烦,在此偷个懒吧,关于此方向的数据就不整理了,得出的结论和上面的一样。
五、 结论
- 设备总是把状态栏所在的方向做为上方位,显示层的设置方向决定了拍摄到的图片哪个方位做为上方位,然后再把图片的上方位旋转到状态所在方向。<font color=red>所以只有当显示层的方向与状态栏方向一致时,显示层显示的图片方向才会为我们实际拍摄的图片方向.</font>
- AVCaptureStillImageOutput的connection.videoOrientation 决定了UIImage属性imageOrientation值,拍摄时手机方向决定了图片上方位实际朝向,只有当图片上方位的方向与UIImage属性imageOrientation值方向一致时,通过方向纠正才能得到正确的图片朝向,<font color=red>所以只有当AVCaptureStillImageOutput的connection.videoOrientation与拍摄时手机方向(设备方向)一致时,才能得到正常的图片。</font>
结束语
支持屏幕旋转的同理,在此不在做数据整理。只要每次在屏幕旋转时,按以上的结论重新设置显示层和输出流的方向即可。
I
网友评论