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

时间:2019-03-29 19:16:14

标签: ios swift avfoundation ios-camera

我有一个视图控制器,它使用AVCapturePhotoOutput拍照。 我已经锁定了视图控制器的可能方向,以便相机预览不会旋转:

override var supportedInterfaceOrientations : UIInterfaceOrientationMask {
        return .portrait
    }

问题1:由于更改了照片,因此当我拍照时,无论设备是纵向还是横向模式,结果图像始终为UIImageOrientation == .right

问题2:然后我想使用UIImageJPEGRepresentation将图像保存到文件系统中,但是该方法不包括相对于方向的exif信息(现在可以,因为当前方向错误)由于问题1)。

我只想做许多其他应用程序正在做的事情:显示设备旋转时不会旋转的相机预览,但是所拍摄的图像具有正确的方向,因此我可以保存它们。

是否有必要这样做而不必使用绘制方法旋转图像的数据?

1 个答案:

答案 0 :(得分:0)

问题在于,锁定界面方向时:

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