图片优化
- 质量压缩
- 尺寸压缩
- 无损压缩
Bitmap.compress()
public boolean compress(Bitmap.CompressFormat format, int quality, OutputStream stream) ;
这个方法有三个参数:
- Bitmap.CompressFormat format 图像的压缩格式;
- int quality 图像压缩率,0-100。 0 压缩100%,100意味着不压缩;
- OutputStream stream 写入压缩数据的输出流;
返回值
- 如果成功地把压缩数据写入输出流,则返回true。
inJustDecodeBounds
- Options中有个属性inJustDecodeBounds,我们可以充分利用它,来避免大图片的溢出问题。
- 如果该值设为true那么将不返回实际的bitmap,也不给其分配内存空间这样就避免内存溢出了。但是允许我们查询图片的信息,这其中就包括图片大小信息,options.outHeight (图片原始高度)和option.outWidth(图片原始宽度)。
- Options中有个属性inSampleSize,我们可以充分利用它,实现缩放,如果被设置为一个值,要求解码器解码出原始图像的一个子样本,返回一个较小的bitmap,以节省存储空间。例如,inSampleSize = 2,则取出的缩略图的宽和高都是原始图片的1/2,图片大小就为原始大小的1/4。
libjpeg
- libjpeg是一个完全用C语言编写的库,包含了被广泛使用的JPEG解码、JPEG编码和其他的JPEG功能的实现。
libjpeg-turbo
- libjpeg-turbo图像编解码器,使用了SIMD指令(MMX,SSE2,NEON,AltiVec)来加速x86,x86-64,ARM和PowerPC系统上的JPEG压缩和解压缩。在这样的系统上,libjpeg-turbo的速度通常是libjpeg的2-6倍,其他条件相同。在其他类型的系统上,凭借其高度优化的霍夫曼编码,libjpeg-turbo仍然可以大大超过libjpeg。在许多情况下,libjpeg-turbo的性能可与专有的高速JPEG编解码器相媲美。
图片压缩流程
左移右移运算
左移操作(<<)
规则:
右边空出的位用0填补
高位左移溢出则舍弃该高位。
即 3 在32位计算机中的存储为(前后两条黑色竖线人为添加以方便于识别):
| 0000 0000 0000 0000 0000 0000 0000 0011 |
左移2位结果如下:
00 | 00 0000 0000 0000 0000 0000 0000 0011 XX |
左移两位高位溢出,舍弃,低位也就是XX的位置空余,则补0变为:
| 0000 0000 0000 0000 0000 0000 0000 1100 |
再转换为十进制数:输出即为:12。
右移操作(>>)
左边空出的位用0或者1填补。正数用0填补,负数用1填补。
例如:6>>1
| 0000 0000 0000 0000 0000 0000 0000 0110 |
我们进行右移操作
| 0000 0000 0000 0000 0000 0000 0000 0011 | 0
则结果为 6>>1 = 3
“与”运算
运算规则:0&0=0;0&1=0;1&0=0;1&1=1;
即:两位同时为“1”,结果才为“1”,否则为0
第一个输入 | 第二个输入 | 输出结果 |
---|---|---|
1 | 1 | 1 |
1 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 0 |