如何从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
相关产品推荐
相关产品推荐

