Bitmap的二次采样

来源:互联网 发布:mysql decimal 截断 编辑:程序博客网 时间:2024/04/29 07:03

Bitmap可以理解为通过一个bit数组来存储特定数据的一种数据结构。

一,二次采样的意义和目的;

当网络访问加载图片的时候,我们会遇到OOM异常。这是因为图片过大产生的。想要正确使用则需要分配更少的内存空间。

1、首先看下bitmapFactory.decodeFile(imageFile,option)和bitmapFactory.decodeFile(imageFile);

返回的都Bitmap对象。第一个方法法是根据根据图片地址和参数来返回一个Bitmap对象,第二个方法根据图片的url来返回Bitmap.

2、为了设置图片的裁剪要了解、BitmapFactory.Options.inSampleSize

来设置宽高的比例。(个人理解就是:拿到图片的以前宽高和现在的宽高,算出比例可以往下看下代码)

BitmapFactory.Options bop=new BitmapFactory.Options() ;
        bop.inSampleSize=4;

BitmapFactory.decodeFile("path",bop);

3.还有一个关于BitmapFactory.Option.inJustDecodeBounds,true为不分配控件。

是为了管理系统是否为BitmapFactory.decodeFile("uri",option)返回的Bitmap分配空间。可以设置true和false.

看完上面的一个方法和两个属性。下面具体写下代码

  /**
     * 把二次裁剪封装一个方法。
     */
   private Bitmap createImageThumbnail(String filepath,int newWidth,int newheight){
       BitmapFactory.Options opts=new BitmapFactory.Options();
       //此时并不会为  BitmapFactory.decodeFile(filepath, opts)分配空间
       //因为已经设置了inJustDecodeBounds为fales;
       opts.inJustDecodeBounds=true;
       //此时opts已经包含了未裁剪的宽高
       BitmapFactory.decodeFile(filepath, opts);

      //得到原图片的宽高

       int oldHeight=opts.outHeight;
       int oldWidth=opts.outWidth;

      //获取新旧图片的比例

       int rationHeight=oldHeight/newheight;
       int rationWidth=oldWidth/newWidth;
       opts.inSampleSize=rationHeight>rationWidth?rationWidth:rationHeight;

      //确定bitmap的单位字节像素

       opts.inPreferredConfig=Config.RGB_565;
       opts.inJustDecodeBounds=false;
       Bitmap bm=BitmapFactory.decodeFile(filepath, opts);
       return bm;
   }

三、借鉴别人的

三)、图片格式占用内存的计算方法:以一张100*100px的图片占用内存为例
  • ALPHA_8:
    •  图片长度*图片宽度
    •  100*100=10000字节
  • ARGB_4444:
    •  图片长度*图片宽度*2
    •  100*100*2=20000字节 
  • ARGB_8888:
    •  图片长度*图片宽度*4
    •  100*100*4=40000字节 
  • RGB_565:
    •  图片长度*图片宽度*2
    •  100*100*2=20000字节



0 0
原创粉丝点击