从UIImagePickerController获取深度数据

时间:2018-05-08 19:01:35

标签: uiimagepickercontroller cgimagesource

我正在尝试获取与PhotoLibrary中的图像相关联的深度数据。 我可以获取图像和 URL ,但我似乎无法获得与之相关的辅助数据。对CGImageSourceCreateWithURL的调用会返回一个来源,但CGImageSourceCopyAuxiliaryDataInfoAtIndex的调用会为nilkCGImageAuxiliaryDataTypeDisparity返回kCGImageAuxiliaryDataTypeDepth。 我在这里缺少什么吗?

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

2 个答案:

答案 0 :(得分:0)

studentId提供的图像URL不包括与深度相关的任何元数据。要获取此信息,您必须使用PhotoBook API访问2018/10/08 12:15:04 David access denied 2018/10/08 12:15:05 David access denied 2018/10/08 12:15:05 David access granted 2018/10/08 13:15:14 Karel Jan access granted 2018/10/08 13:15:19 Lydia access denied 2018/10/08 13:15:20 Lydia access denied 2018/10/08 13:15:21 Lydia access granted 2018/10/08 14:15:26 Henk access denied 2018/10/08 14:15:26 Henk access denied 2018/10/08 14:15:27 Henk access denied

首先,导入API:

file="log.txt"
while read -r regel
do
        sort | awk '{file=$1 substr($2,1,2); gsub(/[^0-9]/,"",file) }
                {print > ("logfile_" file ".txt")}'
        zip logfile_20181008.zip logfile_20181008{00..23}.txt   
done < "$file"

在显示图像选择器之前,请请求用户访问相册。您需要为“照片库使用情况”添加信息字典键,才能正常工作:

ArchiveerLog.sh: line 6: syntax error near unexpected token `('
ArchiveerLog.sh: line 6: `  {print > (prefix bestand".txt")}'

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

UIImagePickerController

请注意,文件可能包含深度或视差信息。您可以很容易地在这些之间进行转换,但是您可能需要使用PHAsset来检查哪一个。另外还要注意新的补充深度数据import Photos ,它可以为肖像图像中的对象提供更高的分辨率蒙版,非常适合进行绿屏效果。

答案 1 :(得分:0)

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

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

这里是链接:

LINK TO WWDC VIDEO

如果您不想观看它,请查看我编写的此功能,该功能几乎可以完成视频中的操作。

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

使用此功能之前-请注意,实际上这是行不通的!值得一看的是,它清楚地显示了步骤。但是由于异步行为,该函数在有机会将局部深度变量设置为AVDepthData之前始终将返回nil。

我的解决方案是将功能分开,并使用Grand Central Dispatch创建一个Dispatch组,输入它,从PHAsset中检索imageURL,然后离开Dispatch组。离开调度组后,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
     }