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

13voto

tasomaniac Punkte 9894

Hier ist die schöne Kotlin-Version der Antwort von @Chris.Jenkins hier: https://stackoverflow.com/a/27543712/1016462

fun Drawable.toBitmap(): Bitmap {
  if (this is BitmapDrawable) {
    return bitmap
  }

  val width = if (bounds.isEmpty) intrinsicWidth else bounds.width()
  val height = if (bounds.isEmpty) intrinsicHeight else bounds.height()

  return Bitmap.createBitmap(width.nonZero(), height.nonZero(), Bitmap.Config.ARGB_8888).also {
    val canvas = Canvas(it)
    setBounds(0, 0, canvas.width, canvas.height)
    draw(canvas)
  }
}

private fun Int.nonZero() = if (this <= 0) 1 else this

13voto

Mauro Punkte 579

Vielleicht hilft das ja jemandem...

Von PictureDrawable zu Bitmap, verwenden:

private Bitmap pictureDrawableToBitmap(PictureDrawable pictureDrawable){ 
    Bitmap bmp = Bitmap.createBitmap(pictureDrawable.getIntrinsicWidth(), pictureDrawable.getIntrinsicHeight(), Config.ARGB_8888); 
    Canvas canvas = new Canvas(bmp); 
    canvas.drawPicture(pictureDrawable.getPicture()); 
    return bmp; 
}

... als solche umgesetzt:

Bitmap bmp = pictureDrawableToBitmap((PictureDrawable) drawable);

0 Stimmen

Wie bei der Antwort von Rob, benötigen Sie eine bestimmte Art von Drawable , in diesem Fall ein PictureDrawable .

4 Stimmen

"Vielleicht hilft das ja jemandem..."

12voto

Gelldur Punkte 10409

Hier ist eine bessere Auflösung

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 InputStream bitmapToInputStream(Bitmap bitmap) {
    int size = bitmap.getHeight() * bitmap.getRowBytes();
    ByteBuffer buffer = ByteBuffer.allocate(size);
    bitmap.copyPixelsToBuffer(buffer);
    return new ByteArrayInputStream(buffer.array());
}

Code von Wie man zeichenbare Bits als InputStream liest

12voto

Kishan Donga Punkte 2373

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

Dies wird nicht funktionieren, jedes Mal zum Beispiel, wenn Ihre drawable ist Schicht Liste drawable dann gibt es eine Null-Antwort, so dass als Alternative müssen Sie Ihre drawable in Leinwand dann als Bitmap speichern zu zeichnen, beziehen Sie sich bitte unten eine Tasse Code.

public void drawableToBitMap(Context context, int drawable, int widthPixels, int heightPixels) {
    try {
        File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/", "drawable.png");
        FileOutputStream fOut = new FileOutputStream(file);
        Drawable drw = ResourcesCompat.getDrawable(context.getResources(), drawable, null);
        if (drw != null) {
            convertToBitmap(drw, widthPixels, heightPixels).compress(Bitmap.CompressFormat.PNG, 100, fOut);
        }
        fOut.flush();
        fOut.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

private Bitmap convertToBitmap(Drawable drawable, int widthPixels, int heightPixels) {
    Bitmap bitmap = Bitmap.createBitmap(widthPixels, heightPixels, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    drawable.setBounds(0, 0, widthPixels, heightPixels);
    drawable.draw(canvas);
    return bitmap;
}

obiger Code speichert die Zeichnungsdatei als drawable.png im Download-Verzeichnis

8voto

kc ochibili Punkte 3017

Android bietet eine nicht ganz einfache Lösung: BitmapDrawable . Um die Bitmap zu erhalten, müssen wir die Ressourcen-ID angeben R.drawable.flower_pic zum a BitmapDrawable und dann in eine Bitmap .

Bitmap bm = ((BitmapDrawable) getResources().getDrawable(R.drawable.flower_pic)).getBitmap();

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