我打电话给AVFoundation的委托方法来处理照片捕获,但我很难将其生成的AVCapturePhoto转换为正确方向的UIImage。虽然下面的例程是成功的,但我总是得到一个正确的UIImage(UIImage.imageOrientation = 3)。我没有办法在使用UIImage(data:image)时尝试先使用photo.cgImageRepresentation()?. takeRetainedValue()也没有帮助。请协助。如何以正确的方向从AVCapturePhoto生成UIImage?
由于生成的图像被送入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: 阅读苹果的Photo Capture Programming Guide(过时的iOS11的),我还是设法找到一件事我做错了:
- 每次捕捉调用(self.capturePhotoOutput .capturePhoto)必须设置与PhotoOutput对象的连接并更新其方向以匹配拍摄照片时设备的方向。为此,我创建了UIDeviceOrientation的扩展,并将其用于我创建的snapPhoto()函数以调用捕获例程并等待didFinishProcessingPhoto委托方法执行。我添加了代码的快照,因为这里的代码示例分隔符似乎没有正确显示它们。
更新2 链接到完整的项目在GitHub上:https://github.com/agu3rra/Out-Loud
有趣,和可能的[错误到文件(http://bugreport.apple.com)。如果将数据写入文件并使用基于文件的'UIImage'初始化程序,它是否似乎忽略方向? – rickster
在snapPhoto()例程(UPDATE 1)上添加了连接调用之后,它不再忽略方向,但它在我创建的UIImage上返回了不正确的方向值。 –
关于您的方向扩展。苹果已经发布了AVCam更新。有一个类似的扩展。 'extension UIDeviceOrientation {var VideoOrientation:AVCaptureVideoOrientation? { 开关自{ 情况.portrait:返回.portrait 情况.portraitUpsideDown:返回.portraitUpsideDown 情况.landscapeLeft:返回.landscapeRight 情况.landscapeRight:返回.landscapeLeft 默认:返回零 } } }' –