android开发中,常常会遇到图片的上传后者下载等操做,可是系统分配给当前应用的最大可用内存有限,通常是16M,32M,因此加载大图很容易出现OOM。所以须要对图片进行压缩处理android
先介绍一下图片占用内存的计算:服务器
一个图片所占内存 = 长 x 宽 x 一个像素点所占字节数。(图片像素 = 长 x 宽)code
Android中的Bitmap默认使用的是ARGB_8888。orm
因此一个1280*800的图片所占用的内存大小:1280*800*4/(1024*1024) = 3.9M。图片
图片压缩目的就是要减小图片所占内存大小,明显地,咱们能改变的是长 和 宽。内存
通常来讲,图片压缩无外乎:质量压缩,大小压缩。开发
一、质量压缩文档
关键方法:bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);get
这种压缩,图片的长 ,宽 和 像素的字节数 都没有变化,那么是怎么实现压缩效果的呢?it
实际上,是经过该改变位深,透明度等牺牲图片质量的方式来达到压缩的目的。可是图片所占内存并无
改变。
解释:
好比说图片是500k,1280 * 800像素的,经过质量压缩,File形式的图片大小确实变小了,好比说变成100k,以便于上传到服务器。
可是经过Bitmap.decodeFile到内存中,变成Bitmap时,它的像素仍然是:1280 * 800,图片的像素 = bitmap.getWidth() x bitmap.getHeight();
图片是由像素组成的,那么像素是由什么组成的呢?
像素是由位深(色深),透明度等组成。
该方法的官方文档也解释说, 它会让图片从新构造, 可是有可能图像的位深(即色深)和每一个像素的透明度会变化,JPEG onlysupports opaque(不透明), 也就是说以jpeg格式压缩后, 原来图片中透明的元素将消失.因此这种格式极可能形成失真。
总结:经过改变图片质量,达到了对File形式的图片进行压缩,图片的像素并无变化,也就是所占内存没变。(上传文件到服务器时,File要尽可能小)
备注:bitmap.getByteCount() 是计算它的像素所占用的内存。
二、大小压缩
经过设置采样率,如:newOpts.inSampleSize = 2;来达到压缩的目的。
采样率改变的是图片的长和宽,这样就改变了图片的像素,最终改变了图片所占的内存。这就达到了压缩的目的。