从UIImagePickerController获取深度数据遇到问题
解决相册图片深度数据获取返回nil的问题
嗨,我来帮你排查这个获取深度/视差数据的问题~你遇到的CGImageSourceCopyAuxiliaryDataInfoAtIndex返回nil的情况,通常是这几个环节没处理好,咱们一步步捋:
1. 先确认目标图片确实包含深度数据
不是所有相册图片都带有深度信息:
- 只有用iPhone的人像模式拍摄、或者部分支持深度的场景下拍摄的照片才有
- 你可以先在系统相册里验证:打开图片后进入「编辑」,如果能看到「景深调节」滑块,说明这张图确实有深度数据;如果没有,那不管怎么调用API都拿不到哦
2. 检查UIImagePickerController的配置与返回的URL有效性
你通过UIImagePickerController拿到的URL,大概率是临时处理后的文件URL,而不是原始PHAsset的完整数据路径——系统可能会对图片做压缩或格式转换,导致辅助数据丢失。
更可靠的方式是通过PHAsset来获取原始数据:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { picker.dismiss(animated: true) // 从info里拿到PHAsset guard let asset = info[.phAsset] as? PHAsset else { print("无法获取PHAsset") return } // 请求获取包含深度数据的图片资源 let options = PHImageRequestOptions() options.isNetworkAccessAllowed = true options.deliveryMode = .highQualityFormat options.resizeMode = .none PHImageManager.default().requestImageDataAndOrientation(for: asset, options: options) { [weak self] data, _, _, info in guard let data = data else { return } // 从Data创建CGImageSource guard let source = CGImageSourceCreateWithData(data as CFData, nil) else { return } // 尝试获取深度数据 if let depthInfo = CGImageSourceCopyAuxiliaryDataInfoAtIndex(source, 0, kCGImageAuxiliaryDataTypeDepth) as? [CFString: Any] { print("拿到深度数据:\(depthInfo)") } // 尝试获取视差数据 if let disparityInfo = CGImageSourceCopyAuxiliaryDataInfoAtIndex(source, 0, kCGImageAuxiliaryDataTypeDisparity) as? [CFString: Any] { print("拿到视差数据:\(disparityInfo)") } } }
3. 检查CGImageSource的创建选项
如果坚持用URL创建CGImageSource,记得设置kCGImageSourceShouldCache为false,避免系统缓存时忽略辅助数据:
let options: [CFString: Any] = [kCGImageSourceShouldCache: false] guard let source = CGImageSourceCreateWithURL(url as CFURL, options as CFDictionary) else { return }
4. 确保导入了正确的框架
Swift里要记得导入ImageIO和Photos框架,否则kCGImageAuxiliaryDataTypeDepth这类常量可能无法正确识别:
import ImageIO import Photos
5. 排除图片格式转换的问题
深度数据通常存储在HEIC格式中,如果图片被转换成JPEG(比如你在picker里开启了allowsEditing,或者系统自动压缩),辅助数据会被丢弃。所以:
- 尽量设置
picker.allowsEditing = false,避免编辑过程中丢失数据 - 请求PHAsset时指定
deliveryMode = .highQualityFormat,确保拿到原始格式的图片
内容的提问来源于stack exchange,提问作者Millerw
相关产品推荐
相关产品推荐

