ios - 无法使 AVPortraitEffectsMatte 代码正常工作

标签 ios swift avfoundation ios12 avkit

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

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)
}

我唯一的改 rebase 本上是修改 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 文件应该没问题。

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

最佳答案

只有当照片中保存了人像效果 mask 时,您才能加载保存在照片中的人像效果 mask 。这听起来像 tautology ,所以让我扩展它:

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

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

    • 您请求它。设置isPortraitEffectsMatteDeliveryEnabled拍摄前在您的照片设置中。

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

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

  • 这同样适用于使用相机捕捉 API 的任何第三方应用程序保存的图像。 (也就是说,如果其他应用程序遵循上述步骤,您可以从其他应用程序保存的图像中读取 mask ,就像您尝试使用 mask 捕获图像一样。)参见 Configuring Camera Capture to Collect a Portrait Effects Matte .

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

关于ios - 无法使 AVPortraitEffectsMatte 代码正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52825530/

相关文章:

php - 有没有办法检测用户是否使用iphone 3GS或4浏览网站?

ios - 成功和失败 block 都没有被执行

ios - 为什么我的 unwind segue 会导致我的应用程序崩溃?

ios - 快速计算 txt/log 文件中的行数

Ios swift View 之间的间距和/或边距百分比 %

ios - 检查应用程序更新时读取 json 错误

swift - 如何添加消息来电提醒弹窗?l

ios - iOS 相机上的 720P 与 1080P 相机缓冲区

ios - 用户可读格式的 CGAffineTransform 矩阵

ios - 苹果公司是否正式禁止在后台访问用于应用程序的相机?