iOS中的高精度图片采集和使用注意点和关键步骤
通常的自定义图片采集方案都是基于AVCaptureSession;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
objc.io-capturing-video
欢迎大家就此问题和我讨论,感谢! openglnewbee@163.com