本文總結了優化應用中圖片資源大小的幾種方法,有效的使用這些方法,可以減小應用的圖片資源體積。
在使用這些優化方法之前,還是有幾個基本的原則要去遵守:
- 使用Assets來管理資源,而不是傳統的直接將圖片加入工程的方式
這樣會有兩個好處:1)相比傳統方式,加載速度快 2)下載后的安裝包里,只會包含一套@2x或是@3x的資源,而不會2套資源都包含。這屬于蘋果在應用瘦身方面做的一項優化。 - 同時提供2x和3x版本(現在沒有必要提供1x的了),且圖片尺寸嚴格符合2:3的比例。否則圖片的大小和視圖的大小不一致,會產生像素不對齊的問題,傷性能。
1 使用TinyPng來優化png格式圖片大小
TinyPng對圖片資源有損壓縮,在大幅減小圖片大小的基礎上,圖片質量上損失很小,肉眼基本上無法分辨出。官方提供了PhotoShop的插件,在設計師將圖片資源導出時,可以選擇TinyPng格式進行導出,從而無縫集成到設計師的工作流中。該插件價格為50美元。
下圖顯示了圖片的壓縮比例:
TinyPng.png
左邊的大小是原始大小,右邊的大小是壓縮后的大小,可見壓縮率在60%左右,很可觀。
2 不包含透明像素的圖片,改為JPEG格式
同樣的圖片,JPEG格式在文件大小上會減少很多。
3 針對大的背景圖片,思考能否修改設計
有時可以用一些小的圖片,拼接后可以達到同樣的效果,但是小圖的體積就比一張大圖的體積小很多。
4 使用九宮格圖片
如果一個圖片適合使用九宮格圖片,那么就不要使用普通的圖片。
5 使用IconFont
IconFont是一種通過字體文件來構建純色圖的方案。更詳細的介紹參見使用IconFont減小iOS應用體積。
該方案的優點:
- 減小應用體積,字體文件比圖片要小
- 圖標保真縮放,解決2x/3x乃至將來nx圖問題
- 方便更改顏色大小,圖片復用
缺點在于: - 只適用于純色icon
- 使用unicode字符難以理解
- 需要維護字體庫
目前在Github上也有開源的庫對此進行支持:
IconFont:阿里巴巴提供
FontAwesomeKit
6 使用WebP格式
關于iOS+WebP,在Google上可以搜索出很多結果,這里不再細說,可以看這篇文章:
在iOS項目中使用WebP格式圖片
總結:
- SDWebImage提供了針對WebP的支持,支持單張圖片和動圖。
- Native中使用本地WebP圖片:
使用UIImage+WebP
分類中的+ (nullable UIImage *)sd_imageWithWebPData:(nullable NSData *)data;
方法,可以從WebP數據,構造出UIImage對象。 - Native中使用網絡WebP圖片:
這種情況下對調用者是透明的,SDWebImage會在下載圖片后分析其格式,針對不同的格式做不同的處理。我們象平常一樣使用SDWebImage即可。 - WebView中使用WebP圖片
由于WebView沒有提供內置對WebP的支持,所以需要使用NSURLProtocol攔截WebView中的網絡請求,判斷是否WebP的請求,如果是WebP的話就將WebP格式的網絡數據,轉碼成WebView認識的Jpeg或Png格式,這樣就可以正常顯示了。
總結
個人覺得最方便的方案是客戶端使用TinyPng,網絡圖片使用WebP。如果是純色圖標,那么IconFont的體積減小效果也非常可觀(大于60%),并且國內的大廠也有使用這種方案的,因此也可以作為備選方案。
附錄
相關工具
圖片資源提取
iOS-Images-Extractor
可以將IPA,Assets.car中的圖片資源進行解包,提取。查找工程中沒被使用的圖片資源
LSUnusedResources