【发布时间】:2017-10-20 15:34:24
【问题描述】:
我正在调用AVFoundation 的委托方法来处理照片捕获,但是我很难将它生成的AVCapturePhoto 转换为具有正确方向的UIImage。虽然下面的例程是成功的,但我总是得到一个右向的UIImage (UIImage.imageOrientation = 3)。使用UIImage(data: image) 时我无法提供方向,尝试首先使用photo.cgImageRepresentation()?.takeRetainedValue() 也无济于事。请帮忙。
图像方向在此处至关重要,因为生成的图像将被输入到 Vision Framework 工作流程中。
func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
// capture image finished
print("Image captured.")
if let imageData = photo.fileDataRepresentation() {
if let uiImage = UIImage(data: imageData){
// do stuff to UIImage
}
}
}
更新 1: 阅读 Apple 的Photo Capture Programming Guide(iOS11 已过时),我确实设法找到了我做错的一件事:
- 在每次捕获调用 (
self.capturePhotoOutput.capturePhoto) 时,必须建立与PhotoOutput对象的连接并更新其方向以匹配拍摄照片时设备的方向。为此,我创建了UIDeviceOrientation的扩展,并在我创建的snapPhoto()函数上使用它来调用捕获例程并等待didFinishProcessingPhoto委托方法被执行。我添加了代码的快照,因为这里的代码示例分隔符似乎没有正确显示它们。
更新 2 GitHub 上完整项目的链接:https://github.com/agu3rra/Out-Loud
【问题讨论】:
-
很有趣,可能还有bug to file。如果您将该数据写入文件并使用基于文件的
UIImage初始化程序,它似乎也忽略了方向吗? -
在 snapPhoto() 例程(更新 1)上添加连接调用后,它不再忽略方向,但它在我创建的 UIImage 上返回不正确的方向值。
-
关于您的定向扩展。 Apple 已发布更新的 AVCam。有一个类似的扩展。
extension UIDeviceOrientation { var videoOrientation: AVCaptureVideoOrientation? { switch self { case .portrait: return .portrait case .portraitUpsideDown: return .portraitUpsideDown case .landscapeLeft: return .landscapeRight case .landscapeRight: return .landscapeLeft default: return nil } } }
标签: avfoundation ios11 avcapturesession swift4