iOS拍摄方向与图片方向关系

转:https://www.jianshu.com/p/badbbf9a9212

 

<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>

结束语

支持屏幕旋转的同理,在此不在做数据整理。只要每次在屏幕旋转时,按以上的结论重新设置显示层和输出流的方向即可。

 



作者:水水兔
链接:https://www.jianshu.com/p/badbbf9a9212
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
posted @ 2022-06-17 17:34  LiuZX_贤  阅读(76)  评论(0编辑  收藏  举报