Glide加载图片into(Target)导致OOM异常

转载请注明出处:http://blog.csdn.net/forevercbb/article/details/51027727
最近在项目中遇到Drawable转换成Bitmap的需求,Glide加载的Drawable对象,而需要的是Bitmap对象。于是找到一个可以使用的方法,但是程序运行之后出现OOM异常,通过AndroidStudio自带的内存检测工具观察得到在加载图片的时候,memory的使用大约增长了几十M。经过对该方法的检查,drawable.getIntrinsicWidth()加载的是原图片的长宽。而Glide加载图片into(Target)时默认加载原图大小。(整理的时候想想这样好像没什么不对,被Glide的自动调整大小给惯的,算是自己疏忽了,总之做个记录)
方法如下:

static Bitmap drawableToBitmap(Drawable drawable) // drawable 转换成bitmap  {  
    int width = drawable.getIntrinsicWidth();// 取drawable的长宽  
    int height = drawable.getIntrinsicHeight();  
    Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ?              Bitmap.Config.ARGB_8888:Bitmap.Config.RGB_565;// 取drawable的颜色格式  
    Bitmap bitmap = Bitmap.createBitmap(width, height, config);// 建立对应bitmap  
    Canvas canvas = new Canvas(bitmap);// 建立对应bitmap的画布  
    drawable.setBounds(0, 0, width, height);  
    drawable.draw(canvas);// 把drawable内容画到画布中  
    return bitmap;  
}  

手动对长宽进行调整,修改后方法如下(主要增加对图片大小的限制):

public Bitmap drawableToBitmap(Drawable drawable) {
                                // 取 drawable 的长宽
                                int w = drawable.getIntrinsicWidth();
                                int h = drawable.getIntrinsicHeight();
                                int reqW = currentItem.getHeight();
                                int reqH = currentItem.getWidth();
                                float widthMultiple = w / reqW * 1.0f;
                                float heithMultiple = h / reqH * 1.0f;
                                float multiple = Math.max(widthMultiple, heithMultiple);
                                w = (int) (w / multiple);
                                h = (int) (h / multiple);

                                // 取 drawable 的颜色格式
                                Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
                                        : Bitmap.Config.RGB_565;
                                // 建立对应 bitmap
                                Bitmap bitmap = Bitmap.createBitmap(w, h, config);
                                // 建立对应 bitmap 的画布
                                Canvas canvas = new Canvas(bitmap);
                                drawable.setBounds(0, 0, w, h);
                                // 把 drawable 内容画到画布中
                                drawable.draw(canvas);
                                return bitmap;
                            }
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值