51

我查看了多个类似的问题,尽管我还没有找到我的问题的正确答案。

我有一个可绘制的,在 shape.xml 中定义

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >

    <solid android:color="@color/bg_color" />
</shape>

我想将它转换为 Bitmap 对象以执行一些操作,但BitmapFactory.decodeResource()返回 null。

这就是我的做法:

Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.shape);

我究竟做错了什么?BitmapFactory.decodeResource()适用于 xml 定义的可绘制对象吗?

4

5 回答 5

99

由于您要加载 a Drawable,而不是 a Bitmap,请使用以下命令:

Drawable d = getResources().getDrawable(R.drawable.your_drawable, your_app_theme);

把它变成一个Bitmap

public static Bitmap drawableToBitmap (Drawable drawable) {

    if (drawable instanceof BitmapDrawable) {
        return ((BitmapDrawable)drawable).getBitmap();
    }

    Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap); 
    drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
    drawable.draw(canvas);

    return bitmap;
}

摘自:如何将 Drawable 转换为位图?

于 2014-06-24T14:21:37.587 回答
3

Android KTX现在有一个扩展功能,用于将 drawable 转换为位图

val bitmap = ContextCompat.getDrawable(context, R.drawable.ic_user_location_pin)?.toBitmap()

if (bitmap != null) {
    markerOptions.icon(BitmapDescriptorFactory.fromBitmap(bitmap))
}
于 2021-09-19T22:50:54.137 回答
2
public static Bitmap convertDrawableResToBitmap(@DrawableRes int drawableId, Integer width, Integer height) {
    Drawable d = getResources().getDrawable(drawableId);

    if (d instanceof BitmapDrawable) {
        return ((BitmapDrawable) d).getBitmap();
    }

    if (d instanceof GradientDrawable) {
        GradientDrawable g = (GradientDrawable) d;

        int w = d.getIntrinsicWidth() > 0 ? d.getIntrinsicWidth() : width;
        int h = d.getIntrinsicHeight() > 0 ? d.getIntrinsicHeight() : height;

        Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        g.setBounds(0, 0, w, h);
        g.setStroke(1, Color.BLACK);
        g.setFilterBitmap(true);
        g.draw(canvas);
        return bitmap;
    }

    Bitmap bit = BitmapFactory.decodeResource(getResources(), drawableId);
    return bit.copy(Bitmap.Config.ARGB_8888, true);
}

//------------------------

Bitmap b = convertDrawableResToBitmap(R.drawable.myDraw , 50, 50);
于 2017-02-28T14:08:21.397 回答
0

它是可绘制的,而不是位图。你应该getDrawable改用

于 2014-06-24T14:21:44.193 回答
0

您可能已放入.xmldirectory:... /drawable-24,并尝试将其放入 ... /drawable

它对我有用,希望这可以帮助某人。

于 2019-07-24T02:39:09.997 回答