[英]Can't get AVPortraitEffectsMatte code to work
我正在嘗試遵循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文件應該沒事的。
有人有工作示例項目嗎? 謝謝
僅當照片中保存了肖像效果遮罩時,才能加載照片中保存的肖像效果遮罩。 這聽起來像是重言式 ,所以讓我擴展一下:
如果您使用AVCapturePhotoOutput
自己捕獲圖像,則在且僅在以下情況下,才能獲得啞光肖像效果:
當前捕獲設備和配置上可用/受支持。 縱向效果需要深度捕捉,因此您需要選擇后置雙攝像頭或前置TrueDepth攝像頭(在配備如此的設備上)並啟用深度傳送 。
您要求它。 拍攝前在照片設置中設置isPortraitEffectsMatteDeliveryEnabled
。
該設備可以生成一個。 人像效果遮罩來自經過訓練可識別人臉特征的機器學習模型。 如果您的照片中沒有可識別的人,那么您就不會有遮罩。 (對不起,寵物愛好者。)
您不會選擇不保存它。 您可以關閉embedsPortraitEffectsMatteInPhoto
,或使用AVCapturePhotoFileDataRepresentationCustomizer
在捕獲后和保存前替換/刪除照片的遮罩(或其他元素)。 顯然,如果您想要遮罩,就不要擺脫它。
由使用相機捕獲API的任何第三方應用程序保存的圖像也是如此。 (也就是說,如果其他應用遵循上述步驟,則可以從其他應用程序保存的圖像中讀取遮罩,與嘗試使用遮罩捕獲圖像時一樣。)請參閱配置相機捕捉以收集人像效果遮罩。
如果您使用Apple的內置Camera應用程序捕獲了照片,則該照片必須是在iOS 12上捕獲的人像模式照片(后置雙攝像頭或前置TrueDepth攝像頭)。
該API似乎適用於前置攝像頭照片,但是尚不適用於前置攝像頭照片。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.