android - sobre - BitmapFactory.decodeResource() devuelve nulo para la forma definida en xml drawable
manual de programacion android (3)
Es un dibujable, no un mapa de bits. Deberías usar getDrawable
en getDrawable
lugar
Revisé varias preguntas similares, aunque no encontré una respuesta adecuada en mi consulta.
Tengo un dibujable, definido en 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>
Quiero convertirlo en un objeto Bitmap para realizar algunas operaciones, pero BitmapFactory.decodeResource()
devuelve un valor nulo.
Así es como lo estoy haciendo:
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.shape);
¿Qué estoy haciendo mal? ¿Es BitmapFactory.decodeResource()
aplicable para dibujables definidos xml?
Ya que desea cargar un Drawable
, no un Bitmap
, use esto:
Drawable d = getResources().getDrawable(...);
Para convertirlo en un 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;
}
Tomado de: ¿Cómo convertir un Drawable a un Bitmap?
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);