最近在网上看了一些关于图片压缩的博客,自己也动手实验了一遍,也算事对图片压缩有了一个了解,打算写个博客记录一下。文末附上参考链接。
Android中涉及到图片的话一般都会用到BitMap类和BitmapFactory类。而本文讲述的图片压缩也都是通过这两个类来实现的。Android中,图片占用内存大小计算公式:图片宽度 * 图片高度 * 图片每一个像素占用的字节数。所以图片占用内存的大小(或者说压缩),就是通过改变这三个值来改变的。
1、质量压缩
这种方法,它是通过改变图片的位深和透明度来实现图片压缩的。它不会改变图片的大小,也不会改变图片占用的内存空间。它改变的是图片对应的BitMap对象的length属性值。下面是实现代码:
private Bitmap compressQuality(Bitmap bitmap){
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG,100,bos);
byte bytes[] = bos.toByteArray();
Log.d(TAG, "compressQuality: length = "+bytes.length);
return BitmapFactory.decodeByteArray(bytes,0,bytes.length);
}
上述代码重点是compress方法的使用,下面是它的API的形式。
//按指定的图片格式以及画质,将图片转换为输出流。
public boolean compress(CompressFormat format, int quality, OutputStream stream)
这个方法接收一个图片格式参数(format),画质参数(quality)还有一个输出流(stream)。图片格式参数有JPEG、PNG和WEBP,画质参数是[0,100]区间。使用这个方法压缩图片的时候,我们主要是想把图片对应的BitMap对象的length属性变小,以应对一些对图片大小有限制的情况。而这里就需要注意,当图片格式参数为Bitmap.CompressFormat.PNG的时候,是无法改变这个length属性值的,因为PNG格式是无损的。画质参数为100的时候,length属性值也不变,表示不压缩。
对于上面代码,还可以学习到的知识点是:BitMap转换成字节数