无法使AVPortraitEffectsMatte代码正常工作

时间:2018-10-15 22:25:41

标签: ios swift avfoundation ios12 avkit

我正在尝试遵循Apple提供的一些代码,以使用iOS 12中引入的一些新类和对象从人像模式照片中检索图像蒙版。代码在这里:

https://developer.apple.com/documentation/avfoundation/avportraiteffectsmatte/extracting_portrait_effects_matte_image_data_from_a_photo

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文件应该没问题。

有人在工作的示例项目吗?谢谢

2 个答案:

答案 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似乎适用于前置摄像头照片,但不适用于前置摄像头照片。