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

如何从UIImagePickerViewController获取缩略图与原图?免手动压缩方案咨询

答案:当然可以直接从UIImagePickerViewController获取缩略图/原图,不用手动压缩!

先给你个明确结论:完全没必要自己写这种耗时的循环压缩逻辑,UIImagePickerViewController本身就支持直接获取不同尺寸的图片,系统的处理效率比你手动实现的压缩高得多,刚好能解决你在iPhone 6上耗时3秒的痛点。

一、直接获取缩略图和原图的方法

在UIImagePickerControllerDelegate的回调方法里,通过info字典的几个关键key就能直接拿到对应的图片:

1. 获取拍摄的原图

用UIImagePickerControllerOriginalImage这个key,拿到的是相机拍摄的原始分辨率图片:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    picker.dismiss(animated: true)
    
    // 取出原图
    if let originalImage = info[.originalImage] as? UIImage {
        // 在这里处理原图即可
    }
}

2. 获取缩略图(或编辑后的图片)

如果你给UIImagePickerViewController设置了allowsEditing = true,用户可以对拍摄的图片进行裁剪,此时用UIImagePickerControllerEditedImage就能拿到裁剪后的缩略图:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    picker.dismiss(animated: true)
    
    // 取出编辑后的缩略图
    if let editedImage = info[.editedImage] as? UIImage {
        // 处理缩略图
    }
}

如果需要更灵活的尺寸控制(比如指定具体像素大小),还可以结合PHAsset(当图片来自相册时)请求指定尺寸的图片,系统会帮你高效完成缩放和压缩,性能比手动循环压缩好太多。

二、说说你当前压缩代码的问题

你写的循环递减压缩质量的方式,在旧设备上效率很低:

  • 每次循环都要重新生成JPEG数据,这是非常耗CPU的操作
  • 0.1的步长调整比较粗糙,可能导致最终图片质量要么不够,要么压缩过度,而且完全没必要这么折腾

系统的图片处理逻辑是经过苹果优化的,无论是缩略图还是原图的获取,都比你手动写的压缩逻辑快很多,能直接解决你遇到的耗时问题。

总结

直接用UIImagePickerViewController提供的key获取对应图片就好,不用自己手动搞循环压缩,既省时间又能获得更好的性能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:07:01