【Android】Android Drawable与Bitmap互转

Drawable转成Bitmap

方法一:创建空Bitmap并用canvas绘制
private Bitmap drawableToBitamp(Drawable drawable)
{    
    //声明将要创建的bitmap
    Bitmap bitmap = null;
    //获取图片宽度
    int width = drawable.getIntrinsicWidth();
    //获取图片高度
    int height = drawable.getIntrinsicHeight();
    //图片位深,PixelFormat.OPAQUE代表没有透明度,RGB_565就是没有透明度的位深,否则就用ARGB_8888。详细见下面图片编码知识。
    Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565;
    //创建一个空的Bitmap
    bitmap = Bitmap.createBitmap(width,height,config);
    //在bitmap上创建一个画布
    Canvas canvas = new Canvas(bitmap);
    //设置画布的范围   
    drawable.setBounds(0, 0, width, height);   
    //将drawable绘制在canvas上
    drawable.draw(canvas);
    return bitmap;
}

图片编码知识——在Android的Bitmap.Config中有四个枚举类型:
ALPHA_8 : 每个像素都需要1个字节(8位)的内存,只存储位图的透明度,没有颜色信息。
ARGB_4444:A(Alpha)、R(Red)、G(Green)、B(Blue)分别占4位,合计2个字节,也就是一个像素占两个字节的内存。由于该精度的位图质量较差,官方不推荐使用。
ARGB_8888:A,R,G,B各占8个位的精度,所以一个像素占4个字节的内存,质量较好,同时占用存储空间也较大。
RGB_565:R占5位精度,G占6位精度,B占5位精度,合计2个字节,只有颜色信息,没有透明度信息。

方法二:BitmapDrawable强转成Bitmap

此方法前提是drawable是一个BitmapDrawable类型的对象,强转成
BitmapDrawable后调用getBitmap方法即可获得bitmap对象:

private Bitmap drawableToBitamp(Drawable drawable)
{
    BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
    Bitmap bitmap = bitmapDrawable.getBitmap();
    return Bitmap;
}

由于Drawable就好几种,常用的有ColorDrawable、BitmapDrawable、ClipDrawable、AnimationDrawable等等加起来有二十多种,只有BitmapDrawable才可以获取bitmap。
Drawable的直接派生类:【Android】Android Drawable与Bitmap互转_第1张图片Drawable的间接派生类:
【Android】Android Drawable与Bitmap互转_第2张图片

Bitmap转Drawable

bitmap转Drawable就很简单,通过BitmapDrawable构造方法传入bitmap即可:

BitmapDrawable drawable=new BitmapDrawable(bitmap)//传入bitmap对象

你可能感兴趣的:(Android,android)