一、壓縮圖片
文件壓縮——內存壓縮
二、文件壓縮方式
1.質量壓縮
2.尺寸壓縮
3.格式選擇:JPEG/WEBP (4.0以上)
三、壓縮原理
/frameworks/base/core/jni/android/graphics/Bitmap.cpp
Skia引擎
Google 研發、開源的C++二維圖形庫
Android:
閹割的skia版本,對jpeg的處理基於libjpeg,對png則是基於libpng。
早期由於cpu喫緊。將libjpeg中的最優哈夫曼編碼關閉了。直到7.0纔打開
四、哈夫曼編碼
一種字符編碼方式,常用於數據文件壓縮。壓縮率通常在20%~90%。
主要思想:
採取可變長編碼方式,對文件中出現次數多的字符采取比較短的編碼,對於出現次數少的字符采取比較長的編碼,可以有效地減小總的編碼長度。
顏色 |
紅 |
黃 |
藍 |
綠 |
白 |
一張圖片佔比 |
9 |
1 |
0 |
0 |
0 |
定長編碼 |
000 |
001 |
010 |
011 |
111 |
變長哈夫曼 |
0 |
01 |
110 |
011 |
111 |
五、LibJpeg-turbo
C語言編寫的JPEG編解碼庫。
1. NDK
https://developer.android.google.cn/ndk/index.html
Android Native Development Kit
一套允許使用原生代碼語言C/C++,實現部分應用的工具集。
C/C++與Java通過JNI交互
2. LibJpeg使用步驟
下載 -> 編譯支持Android CPU架構的庫 -> As集成 ->編碼
3. 下載:
4. 編譯:
https://github.com/libjpeg-turbo/libjpeg-turbo/blob/master/BUILDING.md
5. 步驟:
1、生成configure(只需執行一次)
如果生成x86架構的庫需要NASM/YASM工具(armeabi不需要)
sudo apt-get install libtool
autoreconf -ivf
2、根據BUILDING.md 編寫並執行腳本
build.sh
8. AS集成:
9. 編碼
參考 build.sh中的 --prefix 配置的目錄下的
share/doc/libjpeg-turbo/example.c 中的write_JPEG_file函數
10. 使用
參考 build.sh中的 --prefix 配置的目錄下的
share/doc/libjpeg-turbo/example.c 中的write_JPEG_file函數
11. Bitmap使用Libjepg步驟
1、獲得待壓縮Bitmap
2、獲得Bitmap中像素數據(ARGB->BGR)
3、Libjpeg壓縮
3.1、創建jpeg壓縮對象
3.2、指定存儲文件
3.3、設置壓縮參數
3.4、開始壓縮
3.5、循環寫入每一行數據
3.6、壓縮完成
3.7、釋放jpeg對象
資源鏈接: