今天咋们来学习图片的二次采样,那什么是图片的二次采样呢?为什么要采样呢?那么分两点来学习图片的二次采样:
一、为什么要二次采样
默认情况下,bitmap每个像素点占用4个字节(ARGB_8888),比如一张3543×3503的图片差不多在内存中占用47M安卓系统给每个应用分配的内存都是有限的,可以使用Runtime.getRuntime().maxMemory()来获取
内存有限空间,默认情况下图片存储又需要大量的空间,于是就容易产生OOM(内存溢出)
二、二次采样的实现(这里我封装成了一个方法,使用时需要传入图片的资源id和宽和高的像素)
/**@param id 需要压缩的图片的资源id
*@param maxw 需要压缩图片后宽的像素
*@param maxh 需要压缩图片后高的像素
*/
private Bitmap getCompressBm(int id,int maxw,int maxh) {
Bitmap bm = null;
int iSamplesize = 1;
//只采样边框
BitmapFactory.Options bitmapFactoryOptions = new BitmapFactory.Options();
bitmapFactoryOptions.inJustDecodeBounds = true;
bm = BitmapFactory.decodeResource(getResources(), id, bitmapFactoryOptions);
int iWidth = bitmapFactoryOptions.outWidth;
int iHeight = bitmapFactoryOptions.outHeight;
//对缩放比例进行调整,直到宽和高符合我们要求为止
while (iWidth > w|| iHeight > h){
iSamplesize = iSamplesize*2;
iWidth = iWidth/iSamplesize;
iHeight = iHeight/iSamplesize;
}
bitmapFactoryOptions.inSampleSize = iSamplesize;
//把inJustDecodeBounds置为false
bitmapFactoryOptions.inJustDecodeBounds = false;
// 设置像素颜色信息
bitmapFactoryOptions.inPreferredConfig = Bitmap.Config.RGB_565;
bm = BitmapFactory.decodeResource(getResources(),id, bitmapFactoryOptions);
return bm;//返回压缩后的照片
}