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 |
C语言编写的JPEG编解码库。
1. NDKhttps://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
作者:Easyhood