通常的方案都是基于AVCaptureSession的采集;这里采集出来的源数据的精度是可以通过一系列的配置来控制的;
AVCaptureSessionPresetPhoto
AVCaptureSessionPresetHigh
AVCaptureSessionPresetMedium
AVCaptureSessionPresetLow
。。。
精度从高到低;以iphone6为例,可以输出的最高精度的图片分辨率为2448*3264(AVCaptureSessionPresetPhoto);
而输出在配置为AVVideoCodecJPEG后会自动启用硬件压缩,在这个过程中图像的精度应该没有什么损失。
用户在保存图片前可以根据需要在UIImageJPEGRepresentation里传递不同的参数来生成不同大小的文件(有损压缩,压缩比率不同)。
我们的项目中遇到的问题是,在一个列表中有多个图像选择的控件,控件中的图片来源于拍摄;当我们配置的输出为最高精度的图片时(客户需求,拍摄正式的协议文档等),分辨率是很高的;这里有一个致命的失误:控件中的缩略图直接加载文件原图,在这个过程中生成UIImage占用的内存是非常惊人的;而同时在一个列表中加载几十张高清图片时,很容易就达到了系统所允许的最高阈值,所以被系统kill。而让笔者感到蛋疼的是,没有任何的崩溃日志;相应的viewcontroller里面也没有收到didreceivememorywarning的通知;使用instruments分析的时候能看出一些信息,虽然没有内存泄漏,但allocations一直在增加。我的印象中以前这类问题是有信息的,不知道是系统原因还是什么。
笔者调试该问题的环境是 iphone6 10.2.1系统,xcode 8.2。
参考资料:
New AV Foundation Camera Features for the iPhone 6 and iPhone 6 Plus:
https://developer.apple.com/library/content/technotes/tn2409/_index.html
objc.io-capturing-video:
https://www.objc.io/issues/23-video/capturing-video/
欢迎大家就此问题和我讨论,感谢