Android性能優化-減小圖片下載大小
內容概要
-
理解圖片的格式 PNG JPG WebP
-
如何選擇一種圖片格式
-
確定準確質量值
-
服務端的尺寸大小
?
減小圖像下載大小
大多數流量傳輸都包含圖像。 因此,你制作的下載的圖片越小,就會為用戶提供更好的網絡體驗。 本篇文章提供了讓你的圖像文件更小以及更加網絡友好的指導。
理解圖像的格式
Android應用通常使用以下某種或多種文件格式的圖片:PNG,JPG和WebP。 對于每種格式,你都可以采取措施縮小圖片大小。
PNG
縮小PNG文件的關鍵是減少構成圖像的每行像素中使用的唯一顏色數。通過使用更少的顏色,可以提高在其它管道中的壓縮能力。
減少獨唯一顏色的數量會取得顯著效果的原因是,PNG壓縮效果基于一個水平方向相鄰像素顏色變化程度的函數。因此,減少PNG圖像每行中唯一顏色數量可以減少文件大小。
當決定是否采用這種策略時,你應該記住,減少唯一顏色的數量實際上等于對圖像應用了有損編碼。然而,編碼工具可能不會判斷一個細小的偏差導致多糟糕的視覺效果。因此,為了保證有效壓縮和可接受的圖像質量的平衡,你應該手動執行此工作,
有兩個特別有用的方法你可以采取:優化索引格式和應用矢量量化。
優化索引格式
任何減少顏色的嘗試都應該首先嘗試優化顏色,以便將圖像導出為PNG時可以使用INDEXED格式。 INDEXED顏色模式會選擇最佳的256色彩,并用索引將所有像素值替換到調色板中。 結果是從1600萬色彩減少到僅256色彩:等同于從每像素3(沒有透明度)或4(具有透明度)字節減少到每像素1字節。這種變化向減少文件邁出了重大的一步。
圖片 1.一個圖像在轉換為INDEXED的前后對照
Figure 2 展示了圖像1中的調色板
將圖像表示為調色圖像對于顯著改善文件大小有很大幫助,因此,如果你的大多數圖片都可以轉換,可以好好研究一下。
當然,并不是每個圖像都可以用256種色彩準確表示。 例如,某些圖像可能需要257,310,512或912種顏色才能正確顯示。 在這種情況下,矢量化會可能會有幫助。
矢量化
矢量化(VQ)也許是對創建索引圖像的過程更好地描述。 VQ會對多維數進行舍入處理。 在此過程中,你圖片中的所有顏色都將根據相似性進行分組。 對于給定的組,該組中的所有顏色都將被單個 中心點 值替換,這樣可以最大程度地減少該單元格中的顏色錯誤(如果使用Voronoi術語,則為“site”)。 在圖3中,綠色點表示輸入顏色,而紅色點是替換輸入顏色的中心點。 每個單元格由藍線界定。
圖3 為圖像中的顏色進行矢量化
將VQ應用于圖像會減少了唯一顏色的數量,用視覺質量上“相當接近”的單一顏色替換每組顏色。
此技術也允許你為圖像定義唯一顏色的最大數量。 例如,圖4顯示了1670萬種顏色(每像素24位,或bpp)的鸚鵡頭像,旁邊是一個只使用16(3bpp)唯一顏色的版本。
你可以明顯看到有一些質量的損失; 大多數漸變顏色已經被替換,賦予圖像帶狀效果。 因此該圖片需要超過16種唯一的色彩。
在管道中設置VQ的步驟可以幫助你對圖像中使用的唯一色彩的真實數量有更好地了解,并且可以幫助你顯著地減小它們。 有很多可用的工具來幫助你實現此技術。
JPG
如果你使用的是JPG圖片,這里有幾種只做很小的改變就可以顯著節省文件大小的方法:
- 通過不同的編碼方法生成較小的文件(不影響質量)。
- 稍微調整質量以得到更好的壓縮。
執行這些策略通常可以將文件大小減少高達25%。
選擇工具時,請記住照片導出工具會將不必要的元數據(如GPS信息)插入到圖像中。為了最小化,你可以嘗試利用現有工具刪除這些信息。
WebP
WebP是Android 4.2.1(API 17)支持的較新的圖像格式。 這種格式為網絡圖像提供了卓越的無損和有損壓縮。 使用WebP,開發人員可以創建更小,更豐富的圖像。 WebP無損圖像文件平均比PNG小 26% 。 這些圖像文件還支持透明度(也稱為alpha通道),成本只有 22% 的字節。
WebP有損圖像比同等 SSIM 質量指數下的JPG圖像小 25-34% 。 對于可接受有損RGB壓縮的場景,有損WebP還能支持透明度,產生的文件大小通常比PNG小3倍。
有關WebP的詳細信息,請訪問 WebP 。
選擇一種格式
不同的圖像格式適用于不同類型的圖像。 JPG和PNG的壓縮過程有很大差別,產生的效果差別也很大。
決定使用PNG還是JPG,通常歸結于圖像本身的復雜性。圖5顯示了兩個圖像,由于開發者應用了不同的壓縮方案而導致很大的差別。左側的圖像有許多小細節,因此使用JPG壓縮效率更高。右側的圖像,很多區域具有相同顏色,使用PNG壓縮更有效。
圖5 JPG和PNG的適用場景
WebP格式可以支持有損和無損模式,是PNG和JPG的理想替代品。唯一要記住的是,它只對運行Android 4.2.1(API 17)及更高版本的設備提供支持。不過幸運的是, 大多數設備 都滿足這一要求。
圖6提供了一個簡單的圖示來幫助你決定使用哪種壓縮方案。
Figure 6. 如何決定一種壓縮方案
確定最佳質量值
有幾種技術可以用來實現壓縮和圖像質量之間的正確權衡。有一種技術使用標量值,因此僅適用于JPG和WebP。另一種技術利用了Butteraugli庫,并可用于所有圖像格式。
標量值(僅限JPG和WebP)
JPG和WebP的強大來自于你可以使用標量值來平衡質量和文件大小。訣竅是找出圖像的正確的質量值。太低的質量水平雖然產生文件小,但以犧牲圖像質量為代價。太高的質量水平會增加文件大小,對用戶不友好。
最直接的解決方案是選擇一些非最大值進行嘗試。但是,請注意,質量值對每個圖像的影響不同。例如,75%的質量在大多數圖像上可能看起來很好,但在另一些圖片上效果可能不好。你應該使用圖像的代表性樣本對選擇的最大值進行測試。此外,要確保你是對原始圖像執行所有測試,而不是壓縮版本。
對于每天上傳和發送數百萬個JPG的大型媒體應用程序來說,手動調整每個資源是不切實際的。你可以根據圖像類別指定幾個不同的質量級別來解決這個問題。例如,可以將縮略圖的質量設置為35%,因為較小的圖像隱藏了更多的壓縮偽影(偽影不是很好理解)。
Butteraugli
Butteraugli是一個庫,用于測試圖像的視覺誤差閾值:觀察者開始注意到圖像質量下降的點。換句話說,這個項目試圖將壓縮圖像的失真量化。
Butteraugli允許你定義視覺質量的目標,然后運行PNG,JPG,WebP有損和WebP無損壓縮。然后,你可以選擇文件大小和Butteraugli級別之間效果最佳的圖像。圖7示出了在視覺失真以至于用戶可以感知到之前,如何使用Butteraugli來找到最低的JPG質量水平;最終文件大小減少了大約65%。
圖7.應用Butteraugli技術之前和之后的圖像。
Butteraugli允許你基于輸出或輸入進行處理。也就是說,你可以在用戶感覺到圖像出現明顯失真之前找到最低的質量設置,或者你可以依次設置圖像失真級別去觀察對應的質量水平。
服務端的尺寸
在服務器上僅存有一種分辨率的圖像的方式是很便利的。當設備訪問映像時,服務器直接返回給設備該分辨率的圖片。
雖然這個解決方案方便了開發者,但對用戶來說可能很痛苦,因為這種方案迫使用戶下載比實際需要更多的數據。你應該存儲多個大小的圖像,并根據合適的使用場景提供不同的圖像。例如,對于縮略圖,服務應該提供縮略圖圖像而不是全尺寸的版本,這樣可以節省很多網絡帶寬。
這種方法對于下載速度是有利的,并且降低了使用有限或按數據量收費用戶的成本。圖像在設備和主存儲器上也會占用更少的空間。在大圖像(例如4K圖像)的情況下,這種方式還減少了設備在加載圖像之前調整大小的時間。
實現此方法需要有一個后端圖像服務,以提供具有適當緩存的各種分辨率的圖像。有幾種現有的服務可以幫助你,例如, App Engine 自帶了調整圖片大小的功能。
來自:http://www.lightskystreet.com/2016/10/19/android-optimize-image-download-size/