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

60voto

MyDogTom Punkte 4301

Android-ktx hat Drawable.toBitmap Methode: https://Android.github.io/Android-ktx/core-ktx/androidx.graphics.drawable/Android.graphics.drawable.-drawable/to-bitmap.html

Von Kotlin

val bitmap = myDrawable.toBitmap()

2 Stimmen

Dies ist die einfachste Lösung für eine VectorDrawable in Kotlin! Auch geteilt in diesem SO-Beitrag hier ausführlicher zu erläutern.

0 Stimmen

Ich erhalte eine leere Bitmap von dieser Methode.

51voto

Sanjayrajsinh Punkte 11553

1) Drawable zu Bitmap :

Bitmap mIcon = BitmapFactory.decodeResource(context.getResources(),R.drawable.icon);
// mImageView.setImageBitmap(mIcon);

2) Bitmap zu Drawable :

Drawable mDrawable = new BitmapDrawable(getResources(), bitmap);
// mImageView.setDrawable(mDrawable);

2 Stimmen

Die Frage besagt eindeutig, dass sich die Drawable nicht in R.drawable befinden. und Ihre Lösung ist für R.drawable.

32voto

Erfan Bagheri Punkte 638

Sehr einfach

Bitmap tempBMP = BitmapFactory.decodeResource(getResources(),R.drawable.image);

11 Stimmen

Dies ist nur ein Plagiat der andere Antwort zu dieser Frage drei volle Jahre zuvor

20voto

Balazs Banyai Punkte 644

Die neueste androidx-Kernbibliothek (androidx.core:core-ktx:1.2.0) hat jetzt eine Erweiterungsfunktion: Drawable.toBitmap(...) um ein Drawable in ein Bitmap zu konvertieren.

1 Stimmen

Ich weiß nicht genau, wie ich diese Funktion importieren kann. Ich nehme an, dass es auch außerhalb von Kotlin funktioniert?

1 Stimmen

Aus Java müssen Sie die Kt-Datei importieren, die die Erweiterungsmethoden enthält. Außerdem ist die Signatur etwas komplexer, da der Empfänger und die Standardparameter in Java nicht verfügbar sind. Sie wird wie folgt aussehen: DrawableKt.toBitmap(...);

19voto

Chris.Jenkins Punkte 12883

Nachdem ich mir die anderen Antworten angeschaut (und benutzt) habe, scheint es so, als ob sie alle mit ColorDrawable y PaintDrawable schlecht. (Vor allem auf Lollipop) schien, dass Shader s wurden optimiert, so dass einfarbige Blöcke nicht korrekt behandelt wurden.

Ich verwende jetzt den folgenden Code:

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

    // We ask for the bounds if they have been set as they would be most
    // correct, then we check we are  > 0
    final int width = !drawable.getBounds().isEmpty() ?
            drawable.getBounds().width() : drawable.getIntrinsicWidth();

    final int height = !drawable.getBounds().isEmpty() ?
            drawable.getBounds().height() : drawable.getIntrinsicHeight();

    // Now we check we are > 0
    final Bitmap bitmap = Bitmap.createBitmap(width <= 0 ? 1 : width, height <= 0 ? 1 : height,
            Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
    drawable.draw(canvas);

    return bitmap;
}

Anders als bei den anderen, wenn Sie setBounds über die Drawable bevor es in ein Bitmap umgewandelt wird, wird es das Bitmap in der richtigen Größe zeichnen!

0 Stimmen

Würde setBounds nicht die vorherigen Grenzen der Zeichenfläche zerstören? Ist es nicht besser, sie zu speichern und anschließend wiederherzustellen?

0 Stimmen

@androiddeveloper, wenn die Grenzen bereits festgelegt wurden, verwenden wir diese ohnehin. In einigen Fällen wird dies benötigt, wenn keine Grenzen gesetzt wurden und keine intrinsische Größe haben (wie z.B. ColorDrawables in einigen Fällen). Breite und Höhe wären also 0, wir geben dem Drawable 1x1, damit es tatsächlich etwas zeichnet. Ich könnte argumentieren, wir könnten einen Typ-Check für ColorDrawable in diesen Fällen tun, aber dies funktioniert für 99% der Fälle. (Sie können es für Ihre Bedürfnisse modifizieren).

0 Stimmen

@Chris.Jenkins Was ist, wenn es keine Grenzen hat und jetzt neue bekommen wird? Ich möchte auch eine andere Frage stellen: Wie kann man am besten die Bitmap-Größe festlegen (auch für BitmapDrawable), die zurückgegeben wird?

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