為什么圖片要壓縮?
一張圖片如果不壓縮的話,所占內存將是他的原始大小,十分占資源。為了解決這種需求,以時間換空間,需要將圖片壓縮保存,使用的時候解壓。不同圖片后綴代表了不同的編解碼算法。
Jpeg
- 將圖像切分為多個塊,每個小塊為8*8的大小。邊長如果大於8,DCT計算量會急劇變大。如果變成小於8,分組變多,壓縮效果變差。
- 對每個塊做離散余弦變換(DCT),把時域圖轉化為頻域圖。左上角為低頻信息,右下角為低頻信息。
- 使用量化器,將高頻信息壓縮,因為低頻信息比高頻信息更重要。移除50%的高頻信息,編碼信息只損失5%。這是Jpeg有損編碼的主要原因。
- 使用Huffman編碼進一步壓縮,並將碼表放入圖片的Head里,用於解碼。
Png
- 查分編碼預解析
- 假設圖片的某一行為[2,3,4,5,6,7,8],查分編碼后就變為[2,1,1,1,1,1,1]
- PNG比較適合漸變顏色,或者相同顏色的壓縮
- 壓縮階段使用Huffman編碼
Webp
- 分塊,每個塊包含16*16的亮度塊和兩個8*8的色塊
- 幀內預測,V_PRED用塊中最上面一行填充所有行,H_PRED使用塊中第一列填充所有列,DC_PRED使用L和A中所有像素的平均值作為唯一的值填充block。使用哪種分塊模式是動態決定的,選與原始值最小的那種預測模式
-
- 將預測出來矩陣和原矩陣的差值做DCT變換
- 量化壓縮,壓縮高頻區域
- 算術編碼,壓縮效率高於Huffman編碼
總結
WebP的壓縮效率比Jpeg高的原因主要是Webp編碼的是預測的差值和使用了算術編碼