转载请注明出处: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;
}