Android中图片的类型压缩

图片的类型

A代表透明度;R代表红色;G代表绿色;B代表蓝色。

ALPHA_8 表示8位Alpha位图,即A=8,一个像素点占用1个字节,它没有颜色,只有透明度 ARGB_4444 表示16位ARGB位图,即A=4,R=4,G=4,B=4,一个像素点占4+4+4+4=16位,2个字节 ARGB_8888 表示32位ARGB位图,即A=8,R=8,G=8,B=8,一个像素点占8+8+8+8=32位,4个字节 RGB_565 表示16位RGB位图,即R=5,G=6,B=5,它没有透明度,一个像素点占5+6+5=16位,2个字节

 

图片压缩方式:

实用:https://tinypng.com/压缩UI那边给的图片

1.质量压缩(android sdk 有提供)

ByteArrayOutputStream baos = new ByteArrayOutputStream(); //内存流 bitmapOld.compress(CompressFormat.JPEG, quality, baos); //quality为压缩百分比 //quality=50,意为压缩为1/2 byte[] bytes = baos.toByteArray(); bitmapNew= BitmapFactory.decodeByteArray(bytes, 0, bytes.length);//生成图片对象

 

通过这种方式,图片的大小是没有发生变化的,因为质量压缩不会改变图片的像素,它是在保存像素的前提下改变图片的位深以及透明度,来达到压缩图片的目的,图片的长、宽、像素都不发生变化,那么bitmap所占的内存大小也是不发生变化的。

但是bytes.length是随着quality变小而变小的。这样适合去传递二进制的图片数据,比如微信分享图片,要传入二进制数据过去,限制32kb之内

2 采样率压缩(android sdk 提供)

BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 2; //inSampleSize 为压缩比 此处为1/2 bm = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getAbsolutePath()+ "/DCIM/Camera/test.jpg", options);

设置inSampleSize的值(int类型)后,假如设为2,则宽和高都为原来的1/2,宽高都减少了,图片总像素就减少了,自然内存也降低了。

Glide默认加载图片时是通过将图片转换成ImageView的大小后再加载。 Picasso默认是加载了全尺寸的图片到内存,然后让GPU来实时重绘大小(也可以手动设置或者将scaletype设置成 centerCrop等)。

 

3 缩放法压缩(martix,android sdk 提供)

Matrix matrix = new Matrix(); matrix.setScale(0.5f, 0.5f); bm = Bitmap.createBitmap(bit, 0, 0, bit.getWidth(),bit.getHeight(), matrix, true);

 

通过上述代码,bitmap的长度和宽度分别缩小了一半,图片大小缩小了四分之一。

4 RGB_565法

BitmapFactory.Options options = new BitmapFactory.Options(); options.inPreferredConfig = Bitmap.Config.RGB_565; //将格式设置成RGB_565 bm = BitmapFactory.decodeFile(Environment .getExternalStorageDirectory().getAbsolutePath() + "/DCIM/Camera/test.jpg", options);

经过此种方式,图片大小直接缩小了一半,长度和宽度也没有变,相比argb_8888减少了一半的内存。

注意:由于ARGB_4444的画质惨不忍睹,一般假如对图片没有透明度要求的话,可以改成RGB_565,相比ARGB_8888将节省一半的内存开销。

 

Glide默认的Bitmap格式就是RGB_565

Picasso是ARGB_8888

你可能感兴趣的:(Android图片,Android)