天天看点

iOS中的高精度图片采集和使用注意点和关键步骤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。

<a href="https://developer.apple.com/library/content/technotes/tn2409/_index.html">New AV Foundation Camera Features for the iPhone 6 and iPhone 6 Plus</a>

<a href="https://www.objc.io/issues/23-video/capturing-video/">objc.io-capturing-video</a>

欢迎大家就此问题和我讨论,感谢! [email protected]

继续阅读