(1)BMP:高质量绘图 保证原图质量,用于相机等
BMP格式图片是有一个一个的像素点组成,每一个像素都是一个颜色.而每一个像素显示的颜色用的二进制位也不相同,这个像素位称之为位深,位深越大,表示每一个像素点所用的二进制位越多,显示的图像也就越清晰。
(2)png:较高质量绘图 体积小,适用于网络传输
png图片是将bmp图片进行压缩,其压缩格式类似于rar压缩——将相同的byte信息合并表示。png图片可以还原,是无损的压缩方式。
(3)jpg:良好的绘图质量 体积小,便于传输
jpg格式图片也是对bmp图片进行压缩,因为眼睛的精度是有限的,jpg利用这一点将很多颜色相近的用同一颜色标识,而对于一大块相同的颜色,则用一个值表示。jpg格式图片不能被还原。
ARGB_8888:ARGB分别代表的是透明度,红色,绿色,蓝色,每个值分别 用8bit来记录,也就是一个像素会占用4byte,共32bit.
ARGB_4444:ARGB的是每个值分别用4bit来记录,一个像素会占用 2byte,共16bit.
RGB_565:R=5bit,G=6bit,B=5bit,不存在透明度,每个像素会占用2byte, 共16bit.
ALPHA_8:该像素只保存透明度,会占用1byte,共8bit.
在实际应用中而言,建议使用ARGB_8888以及RGB_565。 如果你不需要透明度,选择RGB_565,可以减少一半的内存占用.
bitmap所占内存大小计算方式:
图片长度 x 图片宽度 x 一个像素点占用的字节数
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所占内存大小是不会变的。
如果是bit.compress(CompressFormat.PNG, quality, baos);这样的png格式,quality就没有作用了,bytes.length也不会变化,因为png图片是无损的,不能进行压缩。
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,宽高都减少了,图片总像素就减少了,自然内存也降低了。数值越高,压缩的图片就越小,2表示宽高变为原来的1/2,内存变为1/4;
Glide默认加载图片时是通过将图片转换成ImageView的大小后再加载。
Picasso默认是加载了全尺寸的图片到内存,然后让GPU来实时重绘大小(也可以手动设置或者将scaletype设置成 centerCrop等)。
Matrix matrix = new Matrix();
matrix.setScale(0.5f,0.5f);
bm = Bitmap.createBitmap(bit,0,0, bit.getWidth(),bit.getHeight(), matrix, true);
bitmap的长度和宽度分别缩小了一半,图片大小缩小了四分之一;
计算压缩比:要压缩的尺寸/实际尺寸
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig= Bitmap.Config.RGB_565; //将格式设置成RGB_565
bm = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getAbsolutePath() +"/Camera/test.jpg", options);
通过改用内存占用更小的编码格式来达到压缩效果,默认ARGB_8888, 用RGB_565能省一半内存;
Glide默认的Bitmap格式就是RGB_565
Picasso是ARGB_8888
//这里是将图片压缩成我们所期望的长度和宽度(150,150)。
bitmapNew=Bitmap.createScaledBitmap(bitmapOld,150,150,true);
图片的内存大小相应也发生了改变,但图片可能不清晰;