仅支持纵向界面时如何保存相机图像

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
        
    


【讨论】:

以上是关于仅支持纵向界面时如何保存相机图像的主要内容,如果未能解决你的问题,请参考以下文章

当 Activity 固定为纵向时旋转生成的相机图像

如何在 Swift 3 中保存带有顶部图像的相机照片

如何将 Android 默认相机应用设置为仅纵向

如何仅保存从我的图片框中显示的图像

Objective-c:如何在启用纵向锁定的情况下在捕获后修复图像方向

Android相机以人像模式保存图片