一、压缩图片
文件压缩——内存压缩
二、文件压缩方式
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对象
资源链接: