Android性能優化(六)圖片壓縮

一、壓縮圖片

文件壓縮——內存壓縮

二、文件壓縮方式

1.質量壓縮  

2.尺寸壓縮  

3.格式選擇:JPEG/WEBP (4.0以上)

三、壓縮原理

/frameworks/base/core/jni/android/graphics/Bitmap.cpp

Skia引擎

https://skia.org/index_zh

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. 下載:

https://libjpeg-turbo.org/

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對象

  

資源鏈接:

https://download.csdn.net/download/Easyhood/12208476​​​​​​​

https://download.csdn.net/download/Easyhood/12208415​​​​​​​

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章