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​​​​​​​