1095 Stimmen

Wie konvertiert man ein Drawable in ein Bitmap?

Ich möchte eine bestimmte Drawable als Hintergrundbild des Geräts, aber alle Hintergrundbildfunktionen akzeptieren Bitmap s nur. Ich kann nicht verwenden WallpaperManager weil ich vor 2.1 bin.

Außerdem werden meine Zeichnungsdateien aus dem Internet heruntergeladen und befinden sich nicht in R.drawable .

1 Stimmen

2 Stimmen

Bitte wählen Sie die richtige Antwort, nämlich diese: stackoverflow.com/a/3035869/4548520

1 Stimmen

1403voto

Praveen Punkte 88704

Dieses Stück Code hilft.

Bitmap icon = BitmapFactory.decodeResource(context.getResources(),
                                           R.drawable.icon_resource);

Hier eine Version, bei der das Bild heruntergeladen wird.

String name = c.getString(str_url);
URL url_value = new URL(name);
ImageView profile = (ImageView)v.findViewById(R.id.vdo_icon);
if (profile != null) {
    Bitmap mIcon1 =
        BitmapFactory.decodeStream(url_value.openConnection().getInputStream());
    profile.setImageBitmap(mIcon1);
}

1 Stimmen

Ich denke, Sie haben die Url-Werte. Dann sollte meine bearbeitete Antwort helfen.

0 Stimmen

Woher kommt str_url? Ich konnte keine Drawable-Funktion finden, die sich auf Strings bezieht... danke für Ihre Hilfe.

15 Stimmen

Ich glaube, ich habe etwas gefunden: Wenn "draw" das Drawable ist, das ich in ein Bitmap umwandeln möchte, dann: Bitmap bitmap = ((BitmapDrawable)draw).getBitmap(); macht den Trick!

833voto

André Punkte 12009
public static Bitmap drawableToBitmap (Drawable drawable) {
    Bitmap bitmap = null;

    if (drawable instanceof BitmapDrawable) {
        BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
        if(bitmapDrawable.getBitmap() != null) {
            return bitmapDrawable.getBitmap();
        }
    }

    if(drawable.getIntrinsicWidth() <= 0 || drawable.getIntrinsicHeight() <= 0) {
        bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888); // Single color bitmap will be created of 1x1 pixel
    } else {
        bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
    }

    Canvas canvas = new Canvas(bitmap);
    drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
    drawable.draw(canvas);
    return bitmap;
}

53 Stimmen

Dies scheint die einzige Antwort zu sein, die für jede Art von Drawable funktioniert und auch eine schnelle Lösung für ein Drawable bietet, das bereits ein BitmapDrawable ist. +1

0 Stimmen

Fügen Sie die Lösung von @Mauro nach der Prüfung auf BitmapDrawable hinzu und Sie haben eine sehr ideale Lösung, bei der alle schnelleren Lösungen inbegriffen sind.

1 Stimmen

Nur eine Änderung: docs sagt über BitmapDrawable.getBitmap(), dass es zurück null kommen kann. Ich sage, es kann auch zurückkommen bereits recycelt.

225voto

Rob Punkte 14715

Dies konvertiert ein BitmapDrawable in ein Bitmap.

Drawable d = ImagesArrayList.get(0);  
Bitmap bitmap = ((BitmapDrawable)d).getBitmap();

10 Stimmen

Ist dies wirklich der beste Weg? Sicherlich könnte das Drawable von einem anderen Typ sein und dies würde eine RuntimeException auslösen? Zum Beispiel könnte es ein ninePatchDrawble sein...?

4 Stimmen

@Dori Sie könnten den Code in eine bedingte Anweisung verpacken, um zu prüfen, ob es sich tatsächlich um eine BitmapDrawable bevor sie geworfen wird: if (d instanceof BitmapDrawable) { Bitmap bitmap = ((BitmapDrawable)d).getBitmap(); }

398 Stimmen

Kannst du die 64 Bewertungen nicht glauben? Dieser Code funktioniert offensichtlich nur, wenn d bereits est a BitmapDrawable in diesem Fall ist es trivial, es als Bitmap abzurufen... Wird abstürzen bei ClassCastException in allen anderen Fällen.

159voto

kabuko Punkte 35597

A Drawable kann auf eine Canvas und eine Canvas kann durch eine Bitmap :

(Aktualisiert, um eine schnelle Konvertierung für BitmapDrawable und um sicherzustellen, dass die Bitmap erstellt wurde, hat eine gültige Größe)

public static Bitmap drawableToBitmap (Drawable drawable) {
    if (drawable instanceof BitmapDrawable) {
        return ((BitmapDrawable)drawable).getBitmap();
    }

    int width = drawable.getIntrinsicWidth();
    width = width > 0 ? width : 1;
    int height = drawable.getIntrinsicHeight();
    height = height > 0 ? height : 1;

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

    return bitmap;
}

0 Stimmen

Was passiert, wenn drawable param null ist?

1 Stimmen

Diese Methode unterstützt keine VectorDrawable

0 Stimmen

66voto

Keyur Lakhani Punkte 4095

METHODE 1 : Entweder Sie konvertieren direkt in ein Bitmap wie folgt

Bitmap myLogo = BitmapFactory.decodeResource(context.getResources(), R.drawable.my_drawable);

METHODE 2 : Sie können sogar die Ressource in ein Drawable umwandeln und daraus eine Bitmap wie folgt erzeugen

Bitmap myLogo = ((BitmapDrawable)getResources().getDrawable(R.drawable.logo)).getBitmap();

Für API > 22 getDrawable Methode wurde in den Bereich ResourcesCompat Klasse, so dass Sie dafür etwas wie folgt tun

Bitmap myLogo = ((BitmapDrawable) ResourcesCompat.getDrawable(context.getResources(), R.drawable.logo, null)).getBitmap();

0 Stimmen

ResourcesCompat funktioniert nur, wenn die Zeichenfläche ein BitmapDrawable ist, wenn Sie VectorDrawable verwenden, dann werden Sie ein CCE haben.

0 Stimmen

Keines von beiden funktioniert mit einer VectorDrawable Ressource. Der folgende Fehler tritt auf - android.graphics.drawable.VectorDrawable cannot be cast to android.graphics.drawable.BitmapDrawable

0 Stimmen

Diese Lösung funktioniert gut mit Kotlin.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X