iOS 圖片處理內存優(yōu)化ImageIO

參考:
[ WWDC2018 ] - 深入解析iOS內存 iOS Memory Deep Dive
[ WWDC2018 ] - 圖像最佳實踐 Image and Graphics Best Practices
談談 iOS 中圖片的解壓縮

圖片原理小科普

不管是 JPEG 還是 PNG 圖片,都是一種壓縮的位圖圖形格式。
要在屏幕上渲染出圖片,必須將壓縮后的數據進行解碼,拿到原始像素數據,才能進行后續(xù)繪制操作。
而解壓過程是一個大量占用CPU資源的工作。
原始像素數據大小和圖片文件大小無關,和圖片尺寸正相關。
原始像素數據大小 = 圖片像素長 * 圖片像素寬 * 像素格式。

圖片加載處理

  1. [UIImage imageNamed:@""]

常用與加載Assets.xcassets內的小圖片嗎,會有緩存。

  1. [UIImage imageWithContentsOfFile:path]

常用語加載文件夾內圖片,無緩存。

  1. ImageIO的方式
    加載:在Decode前插入創(chuàng)建縮略圖的過程。即對image進行預處理,采用縮小解碼后Image Buffer的size的方式,減少內存的占用。
    縮放:ImageIO 能夠在不產生 dirty memory 的情況下讀取到圖片尺寸和元信息,其內存損耗等于縮減后的圖片尺寸產生的內存占用。

實踐對比

 測試:iPhone7 11.2.6系統下,Xcode9.4
 本地文件148KB的jpg圖片:
     通過[UIImage imageWithContentsOfFile:path]加載內存占用為15.7MB左右,
     通過ImageIO加載,內存占用為13.2MB左右
 對比sdwebImage:
     加載本地圖片4張:
         通過SDWebImage,內存占用為15MB左右
         通過ImageIO加載,內存占用為14MB左右
     加載網絡圖片:
          通過SDWebImage,內存占用為14MB左右
          通過ImageIO加載,內存占用為14.5MB左右

注意

API為CF庫,需注意內存的釋放問題。
最佳實踐:創(chuàng)建串行隊列,在串行隊列內通過ImageIO獲取處理圖片,切回主隊列進行UI更新。

Demo

測試-github

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容