web-dev-qa-db-ja.com

BitmapFactory.decodeResource()は、xml drawableで定義された形状に対してnullを返します

クエリで適切な回答が見つかりませんでしたが、複数の同様の質問を調べました。

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>
_

いくつかの操作を実行するためにビットマップオブジェクトに変換したいのですが、BitmapFactory.decodeResource()はnullを返します。

これは私がそれをやっている方法です:

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

私は何を間違えていますか? BitmapFactory.decodeResource()はXML定義のドロウアブルに適用可能ですか?

34
mol

Drawableではなく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をBitmapに変換する方法?

61
Philipp Jahoda
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);
1
Ali Bagheri

.xmlディレクトリへ:.../drawable-24、および.../drawable代わりに。

それは私のために働く、これが誰かを助けることを願っています。

0
Raindeavor

ビットマップではなく、ドローアブルです。代わりにgetDrawableを使用する必要があります

0
Blackbelt