您的位置:首页 > 其它

Bitmap的二次采样

2015-12-22 11:51 274 查看
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字节
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: