美文网首页
bitmap二次采样和图片模式

bitmap二次采样和图片模式

作者: link的勇气 | 来源:发表于2018-03-23 17:55 被阅读0次

    二次采样

    日常开发中,有时会需要加载体积比较大的图片,而实际上imageView的大小也往往不足以显示图片文件的所有像素点。加载尺寸太大的图片到内存中也有引发OOM的隐患。二次采样可以很好的解决这个问题。

    /**
    
    * @param iv 目标ImageView
    
    * @param imgFile 图片文件
    
    */
    
    public void insampleImage(ImageView iv, File imgFile){
    
    BitmapFactory.Options options =new BitmapFactory.Options();
    
        options.inJustDecodeBounds =true;//该属性设为true,加载图片是只会加载图片的边框,不会加载实际像素点。
    
        BitmapFactory.decodeFile(imgFile.getAbsolutePath(),options);//第一次采样
    
        //获取目标宽高
    
        int ivWidth =iv.getWidth();
    
        int ivHeight =iv.getHeight();
    
        //获取图片的宽高
    
        int width = options.outWidth;
    
        int height = options.outHeight;
    
        //开始计算采样比例
    
        int inSampleSize =1;
    
        while (ivHeight * inSampleSize < height || ivWidth * inSampleSize < width){//循环直到宽高都小于目标尺寸
    
              //采样的比例是2的倍数
    
              inSampleSize = inSampleSize <<1;
    
        }
    
    //设置回false,表示加载完整图片
    
    options.inJustDecodeBounds =false;
    
    //设置采样比例
    
        options.inSampleSize = inSampleSize;
    
    //设置图片色彩模式
    
        options.inPreferredConfig =Bitmap.Config.ARGB_8888;
    
    //第二次采样,根据采样比例加载图片
    
        Bitmapbitmap =BitmapFactory.decodeFile(imgFile.getAbsolutePath(), options);
    
        iv.setImageBitmap(bitmap);
    
    }
    

    图片模式

    ALPHA_8:每个像素都需要1(8位)个字节的内存,只存储位图的透明度,没有颜色信息

    ARGB_4444:A(Alpha)占4位的精度,R(Red)占4位的精度,G(Green)占4位的精度,B(Blue)占4位的精度,加起来一共是16位的精度,折合是2个字节,也就是一个像素占两个字节的内存,同时存储位图的透明度和颜色信息。不过由于该精度的位图质量较差,官方不推荐使用

    ARGB_8888:这个类型的跟ARGB_4444的原理是一样的,只是A,R,G,B各占8个位的精度,所以一个像素占4个字节的内存。由于该类型的位图质量较好,官方特别推荐使用。但是,如果一个480800的位图设置了此类型,那个它占用的内存空间是:4808004/(10241024)=1.5M

    RGB_565:同理,R占5位精度,G占6位精度,B占5位精度,一共是16位精度,折合两个字节。这里注意的时,这个类型存储的只是颜色信息,没有透明度信息

    相关文章

      网友评论

          本文标题:bitmap二次采样和图片模式

          本文链接:https://www.haomeiwen.com/subject/eyixcftx.html