我正在尝试遵循Apple提供的一些代码,以使用iOS 12中引入的一些新类和对象从人像模式照片中检索图像蒙版。代码在这里:
func portraitEffectsMatteImageAt(_ path: String) -> UIImage? {
let bundlePath = Bundle.main.bundlePath
// Check that the image at given path contains auxiliary PEM data:
guard let fileURL = NSURL(fileURLWithPath: bundlePath).appendingPathComponent(path),
let source = CGImageSourceCreateWithURL(fileURL as CFURL, nil),
let auxiliaryInfoDict = CGImageSourceCopyAuxiliaryDataInfoAtIndex(source, 0, kCGImageAuxiliaryDataTypePortraitEffectsMatte) as? [AnyHashable: Any],
let matteData = try? AVPortraitEffectsMatte(fromDictionaryRepresentation: auxiliaryInfoDict),
let matteCIImage = CIImage(portaitEffectsMatte: matteData)
else {
return nil
}
return UIImage(ciImage: matteCIImage)
}
我唯一的变化是基本上将fileURL修改为在我的捆绑包中使用jpg。 :
guard let fileURL = Bundle.main.url(forResource: "custom00", withExtension: "jpg")
但是,单步执行代码使我看到auxiliaryInfoDict
的分配是nil
。我从以前的项目中导入了这些JPG,该项目使用了较旧的技术来创建深度蒙版(https://www.raywenderlich.com/314-image-depth-maps-tutorial-for-ios-getting-started),因此jpg文件应该没问题。
有人在工作的示例项目吗?谢谢
答案 0 :(得分:1)
仅当照片中保存了肖像效果遮罩时,才可以加载照片中保存的肖像效果遮罩。听起来像是tautology,所以让我扩展一下:
如果您使用AVCapturePhotoOutput
自己拍摄了图像,则在且仅在以下情况下会得到哑光肖像效果:
该功能在当前的捕获设备和配置上可用/受支持。纵向效果需要深度捕获,因此您需要在设备上选择后置双摄像头或前置TrueDepth摄像头如此配备)并启用了depth delivery。
您要的请求。在拍摄前在照片设置中设置isPortraitEffectsMatteDeliveryEnabled
。
设备可以生成一个。肖像效果遮罩来自经过训练可识别人的特征的机器学习模型。如果您的照片中没有可识别的人,那么您就不会有遮罩。 (对不起,宠物爱好者。)
您不会选择退出保存。您可以关闭embedsPortraitEffectsMatteInPhoto
,或使用AVCapturePhotoFileDataRepresentationCustomizer
替换/删除照片的遮罩(或其他遮罩元素),然后再保存。显然,如果您想要遮罩,那就不要摆脱它。
使用相机捕获API的任何第三方应用程序保存的图像也是如此。 (也就是说,如果其他应用遵循上述步骤,则可以从其他应用保存的图像中读取遮罩,与尝试使用遮罩捕获图像时一样。)请参见Configuring Camera Capture to Collect a Portrait Effects Matte。
如果使用Apple内置的Camera应用程序捕获了照片,则该照片必须是在iOS 12上捕获的人像模式照片(后置双摄像头或前置TrueDepth摄像头)。
答案 1 :(得分:0)
该API似乎适用于前置摄像头照片,但不适用于前置摄像头照片。