BitmapFactory.decodeResource () возвращает null для фигуры, определенной в XML drawable
Я просмотрел несколько подобных вопросов, хотя и не нашел правильного ответа на свой запрос.
У меня есть мешочки, определенными в форме.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?
3 ответа:
Так как вы хотите загрузить
Drawable
, а неBitmap
, Используйте это:Drawable d = getResources().getDrawable(...);
Чтобы превратить его в
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; }
Взято из: Как преобразовать Рисоваемое в растровое изображение?
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);