解决图片加载oom

作者: dong_hui | 来源:发表于2017-11-29 17:42 被阅读39次
    • 几个知识点
    A:透明度
    R:红色
    G:绿
    B:蓝
    
    Bitmap.Config ARGB_4444:每个像素占四位,即A=4,R=4,G=4,B=4,那么一个像素点占4+4+4+4=16位 
    Bitmap.Config ARGB_8888:每个像素占四位,即A=8,R=8,G=8,B=8,那么一个像素点占8+8+8+8=32位
    Bitmap.Config RGB_565:每个像素占四位,即R=5,G=6,B=5,没有透明度,那么一个像素点占5+6+5=16位
    Bitmap.Config ALPHA_8:每个像素占四位,只有透明度,没有颜色。
    
    一般情况下我们都是使用的ARGB_8888,由此可知它是最占内存的,因为一个像素占32位,8位=1字节,
    所以一个像素占4字节的内存。假设有一张480x800的图片,如果格式为ARGB_8888,那么将会占用1500KB的内存。
    
    
    • 方案一: 读取图片时注意方法的调用,适当压缩
      public static Bitmap Bytes2BitmapSamll(byte[] b) {
            if (b.length != 0) {
                BitmapFactory.Options opt = new BitmapFactory.Options();
                opt.inPreferredConfig = Bitmap.Config.RGB_565;
                opt.inPurgeable = true;
                opt.inInputShareable = true;
                opt.inSampleSize=2;
                InputStream  in=new ByteArrayInputStream(b);
                return BitmapFactory.decodeStream(in,null,opt);
            }
            return null;
        }
    
    • 方案二:在适当的时候及时回收图片占用的内存
      通常Activity或者Fragment在onStop/onDestroy时候就可以释放图片资源:
     if(imageView != null && imageView.getDrawable() != null){     
          Bitmap oldBitmap = ((BitmapDrawable) imageView.getDrawable()).getBitmap();    
          imageView.setImageDrawable(null);    
          if(oldBitmap != null){    
                oldBitmap.recycle();    
                oldBitmap = null;   
          }    
     }   
     // Other code.
     System.gc();
    
    //圆角显示图片
    public Bitmap toRoundCorner(Bitmap bitmap, int pixels) {
            Bitmap roundCornerBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
            Canvas canvas = new Canvas(roundCornerBitmap);
            int color = 0xff424242;// int color = 0xff424242;
            Paint paint = new Paint();
            paint.setColor(color);
            // 防止锯齿
            paint.setAntiAlias(true);
            Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
            RectF rectF = new RectF(rect);
            float roundPx = pixels;
            // 相当于清屏
            canvas.drawARGB(0, 0, 0, 0);
            // 先画了一个带圆角的矩形
            canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
            paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
            // 再把原来的bitmap画到现在的bitmap!!!注意这个理解
            canvas.drawBitmap(bitmap, rect, rect, paint);
            return roundCornerBitmap;
        }
    
    
    

    相关文章

      网友评论

        本文标题:解决图片加载oom

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