我有一个视图控制器,它使用AVCapturePhotoOutput
拍照。
我已经锁定了视图控制器的可能方向,以便相机预览不会旋转:
override var supportedInterfaceOrientations : UIInterfaceOrientationMask {
return .portrait
}
问题1:由于更改了照片,因此当我拍照时,无论设备是纵向还是横向模式,结果图像始终为UIImageOrientation == .right
。
问题2:然后我想使用UIImageJPEGRepresentation
将图像保存到文件系统中,但是该方法不包括相对于方向的exif信息(现在可以,因为当前方向错误)由于问题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
}
}
}