BitmapFactory.decodeResource() returns null for shape defined in xml drawable

AndroidAndroid DrawableXml Drawable

Android Problem Overview


I looked through multiple similar questions, although I haven't found a proper answer to my issue.

I have a drawable, defined in 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>

I want to convert it to Bitmap object in order to perform some operations, but BitmapFactory.decodeResource() returns null.

This is how I'm doing it:

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

What am I doing wrong? Is BitmapFactory.decodeResource() applicable for xml defined drawables?

Android Solutions


Solution 1 - Android

Since you want to load a Drawable, not a Bitmap, use this:

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

To turn it into a 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;
}

Taken from: https://stackoverflow.com/questions/3035692/how-to-convert-a-drawable-to-a-bitmap

Solution 2 - Android

Android KTX now has an extension function for converting drawable to bitmap

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

if (bitmap != null) {
    markerOptions.icon(BitmapDescriptorFactory.fromBitmap(bitmap))
}

Solution 3 - Android

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);

Solution 4 - Android

it is a drawable, not a bitmap. You should use getDrawable instead

Solution 5 - Android

You may have put .xml into directory:.../drawable-24, and try to put it into .../drawable instead.

it works for me, hope this can help someone.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionmolView Question on Stackoverflow
Solution 1 - AndroidPhilipp JahodaView Answer on Stackoverflow
Solution 2 - AndroidBharat singhView Answer on Stackoverflow
Solution 3 - AndroidAli BagheriView Answer on Stackoverflow
Solution 4 - AndroidBlackbeltView Answer on Stackoverflow
Solution 5 - AndroidRaindeavorView Answer on Stackoverflow