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

PHPickerViewController无法加载WebP图片的解决方法咨询

解决PHPickerViewController无法加载WebP图片的问题

你的问题出在itemProvider.canLoadObject(ofClass: UIImage.self)这个判断上——对于WebP格式的图片,这个方法会返回false,导致后续的加载逻辑根本不会执行。

要解决这个问题,我们可以跳过这个判断,直接从PHPickerResult中获取图片的原始数据,再用UIImage(data:)来初始化图片(iOS 14及以上系统的UIImage已经原生支持WebP解码)。

修改后的完整代码如下:

struct ImagePicker: UIViewControllerRepresentable {
    @Binding var image: UIImage?

    func makeUIViewController(context: Context) -> PHPickerViewController {
        var config = PHPickerConfiguration()
        config.filter = .images
        let picker = PHPickerViewController(configuration: config)
        picker.delegate = context.coordinator
        return picker
    }

    func updateUIViewController(_ uiViewController: PHPickerViewController, context: Context) {}

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    class Coordinator: NSObject, PHPickerViewControllerDelegate {
        let parent: ImagePicker

        init(_ parent: ImagePicker) {
            self.parent = parent
        }

        func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
            picker.dismiss(animated: true)
            
            guard let result = results.first else { return }
            let provider = result.itemProvider
            
            // 直接请求图片数据,而非依赖UIImage类型加载
            provider.loadDataRepresentation(forTypeIdentifier: UTType.image.identifier) { data, error in
                guard let data = data, error == nil else {
                    // 处理数据获取失败的情况
                    print("加载图片数据失败: \(error?.localizedDescription ?? "未知错误")")
                    return
                }
                
                // 用数据初始化UIImage,支持WebP格式
                DispatchQueue.main.async {
                    self.parent.image = UIImage(data: data)
                }
            }
        }
    }
}

关键修改说明:

  • 替换了原有的canLoadObject(ofClass:)判断逻辑,改用loadDataRepresentation(forTypeIdentifier:)直接获取图片的原始二进制数据
  • 使用UTType.image.identifier作为类型标识,覆盖所有图片格式(包括WebP)
  • 获取到数据后,在主线程更新image绑定变量(因为闭包是在后台线程执行的)
  • 增加了错误处理逻辑,方便排查加载失败的情况

内容的提问来源于stack exchange,提问作者misster

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 09:02:58