1.质量压缩
2.尺寸压缩
3.格式选择:JPEG/WEBP (4.0以上)
/frameworks/base/core/jni/android/graphics/Bitmap.cpp
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编解码库。
https://developer.android.google.cn/ndk/index.html
Android Native Development Kit
一套允许使用原生代码语言C/C++,实现部分应用的工具集。
C/C++与Java通过JNI交互
下载 -> 编译支持Android CPU架构的库 -> As集成 ->编码
https://libjpeg-turbo.org/
https://github.com/libjpeg-turbo/libjpeg-turbo/blob/master/BUILDING.md
1、生成configure(只需执行一次)
如果生成x86架构的库需要NASM/YASM工具(armeabi不需要)
sudo apt-get install libtool
autoreconf -ivf
2、根据BUILDING.md 编写并执行脚本
build.sh
参考 build.sh中的 --prefix 配置的目录下的
share/doc/libjpeg-turbo/example.c 中的write_JPEG_file函数
参考 build.sh中的 --prefix 配置的目录下的
share/doc/libjpeg-turbo/example.c 中的write_JPEG_file函数
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