天天看點

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]

繼續閱讀