Android圖片壓縮

1.原色
牛頓通過三棱鏡折射發現自然光是可以分解的:


image.png

他進一步研究,發現自然界只有三種光不能被分解,即紅綠藍(RGB),


image.png

而其他顏色的光均可由這三種光配制而成,因此將紅綠藍稱為原色(三單色)。
2.顏色的表示
藝術界,每種顏色根據顏色的深淺,分為256色(灰度級),計算機中,1bit可以表示兩個數(0和1),而:

1byte=8bit,28=256(2的8次方)
計算機中用1byte(8位的bit值)囊括一種原色,世界上所有的顏色均可以由三原色配制而成,例如計算機想表示某種淺黃色,它就用三原色的數值(253,244,175)進行表示:


image.png

于是,每單位面積顏色由:
3×8=24位的bit值組成(3字節)
人們后來又給顏色定義了透明通道(Alpha值),透明程度也分為256級,因此每單位面積的顏色最終使用32位的bit值進行表示(占4個字節)。
這里的“每單位面積”即為一個像素。
計算機也正是通過“存儲和拼湊”這樣一個個的像素點進行顯示圖片,例如如下這張手機:
image.png

通過無限放大后:
image.png

手機變得非常模糊,再仔細觀察,圖片顯示的是一個個的正方塊,這每一個正方塊都是一個像素點。

3.圖片的存儲:
另外,計算機中有多種關于存儲圖片的格式(png,jpg,webp...),分別用各自的算法都對照片進行了相應的壓縮處理,這樣能有效減少圖片占用的內存。


image.png

Signature:簽名
IHDR:頭文件數據
IDAT:數據塊
IEND:結束塊
圖片點擊右鍵查看的信息,為IHDR數據攜帶的信息。
無損壓縮:通過對冗余數據的存儲方式進行優化,該方式不會丟失文件內容,壓縮率受冗余度的影響,所以壓縮率較低;
有損壓縮:通過丟失不會對文件造成太大影響的數據來達到壓縮效果,所以壓縮率較高;
其中png是無損壓縮格式圖片,jpg是有損壓縮格式圖片, webp同時提供了提供了無損和有損壓縮能力。
因此App中選用png格式的圖標作為素材,因為該格式為無損壓縮,不會出現鋸齒,同時該格式提供了Alpha通道。
4.圖片的壓縮策略:
Android系統底層基于Linux,每個(常規)App應用運行過程fork出一個單獨的進程,分配16/24M的內存空間,因此資源是緊缺的,而App讀取圖片資源的過程是非常消耗資源,在保證圖片視覺不失真前提下縮小體積,對于節省帶寬和電池電量十分重要。
加載數據流中關于圖片的寬(w)高(h)。
github上有一個開源庫做得比較好
Luban
Luban
,它的大致計算過程如下
image.png

1>判斷圖片比例值,是否處于以下區間內:
[1, 0.5625) 即圖片處于 [1:1 ~ 9:16) 比例范圍內
[0.5625, 0.5) 即圖片處于 [9:16 ~ 1:2) 比例范圍內
[0.5, 0) 即圖片處于 [1:2 ~ 1:∞) 比例范圍內
2>判斷圖片最長邊是否過邊界值:
[1, 0.5625) 邊界值為:1664 * n(n=1), 4990 * n(n=2), 1280 * pow(2, n-1)(n≥3)
[0.5625, 0.5) 邊界值為:1280 * pow(2, n-1)(n≥1)

[0.5, 0) 邊界值為:1280 * pow(2, n-1)(n≥1)
3>計算壓縮圖片實際邊長值,
以第2步計算結果為準,超過某個邊界值則:width / pow(2, n-1),height/pow(2, n-1)
4>計算壓縮圖片的實際文件大小,
以第2、3步結果為準,圖片比例越大則文件越大。
size = (newW * newH) / (width * height) * m;
[1, 0.5625) 則 width & height 對應 1664,4990,1280 * n(n≥3),m 對應 150,300,300;
[0.5625, 0.5) 則 width = 1440,height = 2560, m = 200;
[0.5, 0) 則 width = 1280,height = 1280 / scale,m = 500;注:scale為比例值
5>判斷第4步的size是否過小
[1, 0.5625) 則最小 size 對應 60,60,100
[0.5625, 0.5) 則最小 size 都為 100
[0.5, 0) 則最小 size 都為 100
6>將前面求到的值壓縮圖片 width, height, size 傳入壓縮流程,壓縮圖片直到滿足以上數值

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容