【问题标题】:Can't get AVPortraitEffectsMatte code to work无法让 AVPortraitEffectsMatte 代码工作
【发布时间】:2018-10-15 22:25:40
【问题描述】:

我正在尝试按照 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 文件应该没问题。

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

【问题讨论】:

  • 而不是使用 url 尝试使用照片框架来获取照片并使用它的数据,看看是否有效

标签: ios swift avfoundation ios12 avkit


【解决方案1】:

只有当照片中保存有肖像效果蒙版时,您才能加载保存在照片中的肖像效果蒙版。这听起来像是tautology,所以让我扩展一下:

  • 如果您使用AVCapturePhotoOutput 自己拍摄图像,当且仅当:

    • 在当前拍摄设备和配置上可用/支持。人像效果需要深度拍摄,因此您需要选择后置双摄像头或前置原深感摄像头(在设备上)如此装备)并启用depth delivery

    • 您提出要求。在拍摄前在照片设置中设置isPortraitEffectsMatteDeliveryEnabled

    • 设备可以生成一个。人像效果遮罩来自经过训练可识别人类特征的机器学习模型。如果您的照片中没有可识别的人,则您不会得到遮罩。 (对不起,宠物爱好者。)

    • 您不会选择不保存。您可以关闭embedsPortraitEffectsMatteInPhoto,或使用AVCapturePhotoFileDataRepresentationCustomizer 在拍摄后替换/删除照片的遮罩(或其他元素)并在保存之前。显然,如果您想要遮罩,请不要摆脱它。

  • 任何使用相机捕捉 API 的第三方应用程序保存的图像也是如此。 (也就是说,您可以从其他应用程序保存的图像中读取遮罩,如果它们按照上述步骤进行操作,就像您尝试使用遮罩捕获图像一样。)请参阅Configuring Camera Capture to Collect a Portrait Effects Matte

  • 如果您使用 Apple 的内置相机应用拍摄照片,则它必须是在 iOS 12 上拍摄的人像模式照片(后置双摄像头或前置原深感摄像头)。

【讨论】:

    【解决方案2】:

    此 API 似乎适用于前置摄像头照片,但尚不适用于后置摄像头照片。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-15
      • 2015-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多