如何通过imagePickerController筛选带深度信息的人像模式照片?
关于UIImagePickerController筛选人像模式(带深度信息)照片的问题
嘿,这个问题问到点子上了——UIImagePickerController本身确实没有直接提供“仅显示/选择人像模式照片”的原生功能,但我们可以通过两种方式来实现类似需求,分两部分给你说清楚:
1. 能不能用UIImagePickerController让用户仅选择人像模式照片?
原生控制器做不到直接过滤,但可以事后验证。也就是说,你还是得用常规的UIImagePickerController让用户选择照片,然后在imagePickerController(_:didFinishPickingMediaWithInfo:)回调里,检查选中的照片是否带有深度信息。如果不符合,就提示用户重新选择。
验证深度信息的方法有两种:
- 如果你用Photos框架获取对应的
PHAsset,可以直接检查asset.hasDepthData(iOS 10+可用),或者判断asset.mediaSubtypes是否包含.photoDepthEffect(这是系统人像模式照片的标记)。 - 也可以从选中的图片元数据里读取深度信息:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { guard let imageURL = info[.imageURL] as? URL else { return } let options = PHImageRequestOptions() options.isSynchronous = true PHImageManager.default().requestImageDataAndOrientation(for: PHAsset.fetchAssets(withALAssetURLs: [imageURL], options: nil).firstObject!, options: options) { data, _, _, info in guard let imageData = data, let imageSource = CGImageSourceCreateWithData(imageData as CFData, nil), let properties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, nil) as? [CFString: Any], let depthProperties = properties[kCGImagePropertyDepthDictionary] as? [CFString: Any] else { // 没有深度信息,提示用户 print("这不是带深度信息的人像模式照片,请重新选择") return } // 有深度信息,继续处理 print("找到深度信息:\(depthProperties)") } picker.dismiss(animated: true) }
2. 能不能通过该控制器仅浏览带深度信息的人像模式图片?
原生UIImagePickerController不行,但你可以基于Photos框架自定义一个浏览器。原生控制器的浏览界面是固定的,无法添加自定义过滤条件,但用PHFetchOptions可以筛选出所有带深度数据的照片,然后自己搭建一个相册浏览界面(比如用UICollectionView),这样就能只展示符合要求的图片。
示例代码(筛选系统人像模式照片):
let fetchOptions = PHFetchOptions() // 筛选带有深度效果的人像模式照片 fetchOptions.predicate = NSPredicate(format: "mediaSubtype == %d", PHAssetMediaSubtype.photoDepthEffect.rawValue) // 如果要包含所有带深度数据的照片(包括第三方应用拍摄的),可以用hasDepthData // fetchOptions.predicate = NSPredicate(format: "hasDepthData == YES") let fetchResult = PHAsset.fetchAssets(with: .image, options: fetchOptions) // 用fetchResult的数据来构建你的自定义相册界面
额外注意点
.photoDepthEffect是系统相机拍摄的人像模式照片的专属标记,而hasDepthData会包含所有带有深度信息的图片(比如某些第三方相机APP拍的),根据你的需求选择筛选条件。- 自定义相册界面需要处理权限申请(
PHPhotoLibrary.requestAuthorization),这和UIImagePickerController的权限逻辑一致。 - 如果你的应用只需要快速验证而不是提前过滤,用第一种事后验证的方法成本更低;如果需要让用户直接在筛选后的列表里选择,自定义相册是更优解。
内容的提问来源于stack exchange,提问作者Nihil Saboo
相关产品推荐
相关产品推荐

