You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:13:24