android高级之图片二次采样

今天咋们来学习图片的二次采样,那什么是图片的二次采样呢?为什么要采样呢?那么分两点来学习图片的二次采样:

一、为什么要二次采样

默认情况下,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;//返回压缩后的照片
}


你可能感兴趣的:(android开发,位图,android)