jpeglib 的使用 以及哈夫曼算法的理解

232 阅读2分钟

       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