jpeglib 比较好的一点就是 在不影响清晰度的情况下可以对图片进行压缩。
官方文档的下载 : www.ijg.org/ 下载链接 www.ijg.org/files/ 里面多有多个版本, 下载的源码 有针对 Window 和 Unix 的。但是没有看到C++ 或者C的代码,需要在Windows 平台 或者 Unix 平台进行编译。 编译成静态库 和对应的头文件 才能使用。
我们可以使用已经编译好的 libjpeg-turbo.org/ libturboJpeg 帮助我们进行开发。编译过程 根据 github.com/libjpeg-tur… 的提示进行。
编译成功之后,会生成 libturbojpeg.a 的静态库。 和一些头文件 最主要的是 jpeglib.h 作为头文件进行方法的调用 。
把这些 拷贝到 main/cpp 文件夹下。 头文件 和 静态库都可以放在一个文件夹里面,然后在 cmake 文件夹里面用链接的方式 进行 查找。
对文件压缩考虑的参数 一般 就是 : 输入的bitmap, 压缩的程度,输出目标文件的路径。实现的思路如下:
使用 jni 里面 bitmap 的api : AndroidBitmap_getinfo() 获取 AndroidBitmapInfo ,保存了Bitmap 的图像信息,获取图像信息 是为了更好的去遍历每个像素点,方便对每个像素点进行处理。
AndroidBitmap_lockPixes(bitmap, (void**)&pixels ) 。 为了把bitmap里面的像素点写到 pixels 里面 相当于 写进了 byte[][]里面。
开辟一个 内存来存储 rgb 信息 uint8_t 相当于一个byte 值,占8位。需要遍历 pixels 的像素点。 存入到 data 里面 。
int color = (*(int*)pixels) 值 ,然后 采用 移位 和异或的方式 依次把 bgr 提取出来。
原始值 00rrggbb 通过 右移 16位 得到 00 rr, 再和 0xFF & 与运算, 取出 rr 值。 依次取出 gg bb 的值。 data +=3 调到 第四个值的位置, pixels += 4 ,调到 第五个位置。 进行解析。
解析完毕之后, 把存有rgb 的 的 uint8_t * temp 通过 libjpeg 进行压缩。
大概的步骤 就是
1 创建压缩对象 create_compress
2 创建错误对象 std_error
3 通过文件路径 打开一个 一个 文件 File *f .
4 stdio_dest(&jcs,f) 建立 文件 和 压缩对象的关联,操作压缩对象 同步的会把数据更新到文件里面。
5 设置压缩参数。宽 高 像素空间 压缩的点 开启哈夫曼算法。
6 开始压缩,一行一行的的写数据 ,从data里面拿出像素值,写进jcs 里面。压缩完成
哈夫曼算法
也就是哈夫曼树,采用变长的方式来存储数据。 哈夫曼书的计算方式。
比如颜色值 A B C D E F 像素的数量分别是 2 8 11 15 19 22
通过哈夫曼树表示的方法 分别是: 011100 011101 01111 0110 010 00