一 原理
同样的图片,在ios手机上显示的效果要比安卓手机上效果要好?
- 图片处理引擎用的是pc上的图片处理引擎skia
- 去掉一个编码算法—哈夫曼算法。采用定长编码算法
**原因:**当时由于CPU和内存在手机上都非常吃紧 性能差,由于哈夫曼算法非常吃CPU,被迫用了其他的算法。
需求:,随着安卓设备硬件水平的提升,可以在性能的安卓设备上使用一些比较耗费性能的算法,使得图片显示的效果更佳
**实现方式:**绕过安卓Bitmap API层,来自己编码实现----修复使用哈夫曼算法
二 图片基础
argb
一个像素点包涵四个信息:alpha,red,green,blue
a b c d e
abcde acdbe bacde ……
101010100011100
a:001
b:010
c:011
d:100
e:101
用3位来表示一个字符信息,属于定长编码的最优。
abcde
001 010 011 100 101
加权信息编码
a:80%
b:10%
c:10%
d:0%
e:0%
这种情况,编码就可以优化了
a:01
b:10
c:11
优化后的abc:01 10 11
优化前的abc:001 010 011
问题来了:
如何得到每一个字母出现的权重?
哈夫曼编码:需要去扫描真个信息(图片信息–每一个像素包括ARGB),药大量计算,很吃CPU。
1280800像素4
三 引入下载JPEG引擎使用的库—libjpeg库
http://www.ijg.org/
基于该引擎来做一定的开发----自己实现编码。
- 导入库文件libjpegbither.so
- 导入头文件
- 写mk文件
Android.mk
Applicatoin.mk - 写代码
C++: XX.cpp
C: XX.c
四 步骤
- 将android的bitmap解码,并转换成RGB数据
一个图片信息—像素点(argb)
alpha去掉 - JPEG对象分配空间以及初始化
- 指定压缩数据源
- 获取文件信息
- 为压缩设置参数,比如图像大小、类型、颜色空间
boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ - 开始压缩
jpeg_start_compress() - 压缩结束
jpeg_finish_compress() - 释放资源