仅支持纵向界面时如何保存相机图像
Posted
技术标签:
【中文标题】仅支持纵向界面时如何保存相机图像【英文标题】:How to save camera image when only portrait interface supported 【发布时间】:2019-03-29 19:16:14 【问题描述】:我有一个使用AVCapturePhotoOutput
拍照的视图控制器。
我已锁定视图控制器的可能方向,因此相机预览不会旋转:
override var supportedInterfaceOrientations : UIInterfaceOrientationMask
return .portrait
问题1:由于我改变了它,所以当我拍照时,无论设备是纵向还是横向模式,结果图像总是有UIImageOrientation == .right
。
问题2:然后我想使用UIImageJPEGRepresentation
将图像保存到文件系统,但是这个方法不包括与方向相关的exif信息(目前可以,因为方向当前是错误的,因为问题 1)。
我只想做许多其他应用正在做的事情:显示一个在设备旋转时不旋转的相机预览,但拍摄的图像具有正确的方向,我可以保存它们。
有没有办法做到这一点而不必使用绘图方法旋转图像的数据?
【问题讨论】:
你是如何创建你的 UIImage 的? 【参考方案1】:问题是在锁定界面方向时:
override var supportedInterfaceOrientations : UIInterfaceOrientationMask
return .portrait
预览层视频方向没有更新,现在很明显。 由于界面方向被锁定,我使用设备方向来告诉连接使用哪个方向。这样缓冲区数据将具有正确的方向
@IBAction func shutterButtonDidClick(_ sender: Any)
guard let output = self.cameraSession.outputs.compactMap( $0 as? AVCapturePhotoOutput ).first, let photoOutputConnection = output.connection(with: .video), let delegate = self.videoCaptureDelegate else return
let deviceOrientation = UIDevice.current.orientation
//Important line
photoOutputConnection.videoOrientation = AVCaptureVideoOrientation(deviceOrientation: deviceOrientation)
let photoSettings = AVCapturePhotoSettings()
photoSettings.isHighResolutionPhotoEnabled = true
photoSettings.flashMode = output.supportedFlashModes.contains(.auto) ? .auto : .off
photoSettings.isAutoStillImageStabilizationEnabled =
output.isStillImageStabilizationSupported
output.capturePhoto(with: photoSettings, delegate: delegate)
extension AVCaptureVideoOrientation
init(deviceOrientation: UIDeviceOrientation)
switch deviceOrientation
case .portrait: self = .portrait
case .portraitUpsideDown: self = .portraitUpsideDown
case .landscapeLeft: self = .landscapeRight
case .landscapeRight: self = .landscapeLeft
default: self = .portrait
【讨论】:
以上是关于仅支持纵向界面时如何保存相机图像的主要内容,如果未能解决你的问题,请参考以下文章