0

我正在尝试获取与 PhotoLibrary 中的图像关联的深度数据。我可以获取图像和URL,但似乎无法获取与其关联的辅助数据。调用返回源,CGImageSourceCreateWithURL但调用CGImageSourceCopyAuxiliaryDataInfoAtIndex返回nil和。我在这里缺少什么吗?kCGImageAuxiliaryDataTypeDisparitykCGImageAuxiliaryDataTypeDepth

func imagePickerController(_ picker: UIImagePickerController,    didFinishPickingMediaWithInfo info: [String : Any]) {
    let image = info[UIImagePickerControllerOriginalImage]
    let url = info[UIImagePickerControllerImageURL]
    print("url=",url)

    guard let source = CGImageSourceCreateWithURL(url as! CFURL, nil) else {
        return
    }
    guard let auxDataInfo = CGImageSourceCopyAuxiliaryDataInfoAtIndex(source, 0, kCGImageAuxiliaryDataTypeDisparity) as? [AnyHashable : Any] else {
        return
    }
}
4

2 回答 2

1

我为此挣扎了一整天!不过,在观看了标题为“深度编辑图像”的 WWDC 视频的前半部分后,我终于弄明白了。

我的问题是使用不是来自 PHAsset 的图像的 URL。

链接在这里:

WWDC 视频链接

如果您不想看它,请查看我编写的这个功能,它与视频中所做的几乎完全一样。

您必须提供从 UIImagePickerDelegate 的 DID_FINISH_PICKING_IMAGE_WITH_INFO 函数返回的 [info] 函数。

在使用此功能之前 - 请注意这实际上不起作用!不过看起来很棒,因为它清楚地显示了步骤。但由于异步行为,该函数在有机会将局部深度变量设置为 AVDepthData 之前总是返回 nil。

我的解决方案是将功能分开并使用 Grand Central Dispatch 创建一个 Dispatch Group,输入它,从 PHAsset 检索 imageURL,然后离开 Dispatch Group。离开 Dispatch Group 后,DispatchGroup.NOTIFIED 函数将继续执行其余的过程。

我希望这有帮助!!!

     func returndepthdata(usingimageinfo: [UIImagePickerController.InfoKey : Any]) -> AVDepthData? {
          var depthdata: AVDepthData! = nil

          if let photoasset = usingimageinfo[.phAsset] as? PHAsset {
               let input = photoasset.requestContentEditingInput(with: nil, completionHandler: { (input, info) in
                    if let imageurl = input?.fullSizeImageURL {
                         if let source = CGImageSourceCreateWithURL(imageurl as CFURL, nil) {
                              if let imageproperties = CGImageSourceCopyProperties(source, nil) {
                                   if let disparityinfo = CGImageSourceCopyAuxiliaryDataInfoAtIndex(source, 0, kCGImageAuxiliaryDataTypeDisparity) {
                                        if let truedepthdata = try? AVDepthData(fromDictionaryRepresentation: disparityinfo as! [AnyHashable : Any]) {
                                             depthdata = truedepthdata
                                        }
                                   }
                              }
                         }
                    }
               })
          }
          return depthdata
     }
于 2019-11-23T19:10:03.913 回答
0

提供的图像 URLUIImagePickerController不包含任何与深度相关的元数据。要获取此信息,您必须PHAsset使用 PhotoBook API 访问。

首先,导入 API:

import Photos

在显示图像选择器之前,请求用户访问相册。您需要为 Photo Library Usage 添加一个 info 字典键才能使其工作:

    switch PHPhotoLibrary.authorizationStatus() {
    case .notDetermined:
        PHPhotoLibrary.requestAuthorization { (status) in
            if status == .authorized {
                DispatchQueue.main.async {
                    // Display image picker here
                }
            }
        }
    case .authorized: // Display image picker here
    case .denied, .restricted: // Display appropriate error here
    }

现在,在您的图像选择器委托中,您可以执行以下操作:

    if let asset = info[.phAsset] as? PHAsset {
        PHImageManager.default().requestImageData(for: asset, options: nil) { (imageData, dataType, orientation, info) in
            let url = info?["PHImageFileURLKey"] as? URL
            // Pass this URL to your existing code.
        }
    }

请注意,该文件可能包含深度或差异信息。您可以很容易地在这些之间进行转换,但您可能需要检查您使用的是哪一个CGImageSourceCopyProperties()。还要注意新的补充深度数据,kCGImageAuxiliaryDataTypePortraitEffectsMatte它为肖像图像中的人物提供了更高分辨率的蒙版,非常适合制作绿屏风格的效果。

于 2018-10-08T09:00:23.627 回答