wake-up-neo.com

Wie konvertiere ich eine Drawable in eine Bitmap?

Ich möchte ein bestimmtes Drawable als Hintergrundbild für das Gerät festlegen, aber alle Hintergrundbildfunktionen akzeptieren nur Bitmap. Ich kann WallpaperManager nicht verwenden, da ich älter als 2.1 bin.

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

894
Rob

Dadurch wird eine BitmapDrawable in eine Bitmap konvertiert.

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

Dieser Code hilft.

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

Hier eine Version, in 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);
}
1242
Praveen
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;
}
708
André

Ein Drawable kann auf ein Canvas gezeichnet werden, und ein Canvas kann durch ein Bitmap unterstützt werden:

(Aktualisiert, um eine schnelle Konvertierung für BitmapDrawables durchzuführen und sicherzustellen, dass Bitmap eine gültige Größe hat

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;
}
138
kabuko

METHODE 1: Entweder können Sie direkt in eine Bitmap wie diese konvertieren

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

METHODE 2: Sie können die Ressource sogar in das Zeichenformat konvertieren und daraus eine Bitmap erhalten

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

Für API> 22getDrawable wurde die Methode in die Klasse ResourcesCompat verschoben, damit Sie so etwas tun

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

sehr einfach

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

Nachdem sie sich die anderen Antworten angesehen (und benutzt) haben, scheinen sie alle schlecht mit ColorDrawable und PaintDrawable umzugehen. (Besonders auf Lollipop) schienen Shaders so optimiert worden zu sein, dass einfarbige Farbblöcke nicht richtig gehandhabt 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;
}

Im Gegensatz zu den anderen wird die Bitmap in der richtigen Größe gezeichnet, wenn Sie setBounds für Drawable aufrufen, bevor Sie gefragt werden, ob Sie sie in eine Bitmap umwandeln möchten.

14
Chris.Jenkins

Vielleicht hilft das jemandem ...

Verwenden Sie von PictureDrawable zu Bitmap:

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);
13
Mauro

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 aus Wie man Zeichenbits als InputStream liest

11
Dawid Drozd

Hier ist die Nice 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
9
tasomaniac

Android bietet eine nicht gerade vorwärts gerichtete Lösung: BitmapDrawable. Um die Bitmap zu erhalten, müssen wir die Ressourcen-ID R.drawable.flower_pic an a BitmapDrawable übergeben und anschließend in Bitmap umwandeln.

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

Verwenden Sie diesen Code. Er hilft Ihnen, Ihr Ziel zu erreichen.

 Bitmap bmp=BitmapFactory.decodeResource(getResources(), R.drawable.profileimage);
    if (bmp!=null) {
        Bitmap bitmap_round=getRoundedShape(bmp);
        if (bitmap_round!=null) {
            profileimage.setImageBitmap(bitmap_round);
        }
    }

  public Bitmap getRoundedShape(Bitmap scaleBitmapImage) {
    int targetWidth = 100;
    int targetHeight = 100;
    Bitmap targetBitmap = Bitmap.createBitmap(targetWidth, 
            targetHeight,Bitmap.Config.ARGB_8888);

    Canvas canvas = new Canvas(targetBitmap);
    Path path = new Path();
    path.addCircle(((float) targetWidth - 1) / 2,
            ((float) targetHeight - 1) / 2,
            (Math.min(((float) targetWidth), 
                    ((float) targetHeight)) / 2),
                    Path.Direction.CCW);

    canvas.clipPath(path);
    Bitmap sourceBitmap = scaleBitmapImage;
    canvas.drawBitmap(sourceBitmap, 
            new Rect(0, 0, sourceBitmap.getWidth(),
                    sourceBitmap.getHeight()), 
                    new Rect(0, 0, targetWidth, targetHeight), new Paint(Paint.FILTER_BITMAP_FLAG));
    return targetBitmap;
}
5
anupam sharma

ImageWorker Library kann Bitmaps in Zeichen- oder Base64-Dateien konvertieren und umgekehrt.

val bitmap: Bitmap? = ImageWorker.convert().drawableToBitmap(sourceDrawable)

Implementierung

In Projektebene Gradle

allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }

In der Anwendungsstufe Gradle

dependencies {
            implementation 'com.github.1AboveAll:ImageWorker:0.51'
    }

Sie können auch Bitmaps/Drawables/Base64-Bilder von externen Geräten speichern und abrufen.

Überprüfe hier. https://github.com/1AboveAll/ImageWorker/edit/master/README.md

1
Himanshu Rawat

wenn Sie Kotlin verwenden, verwenden Sie den folgenden Code. es wird klappen

// für die Verwendung des Bildpfads

val image = Drawable.createFromPath(path)
val bitmap = (image as BitmapDrawable).bitmap
1
 // get image path from gallery
protected void onActivityResult(int requestCode, int resultcode, Intent intent) {
    super.onActivityResult(requestCode, resultcode, intent);

    if (requestCode == 1) {
        if (intent != null && resultcode == RESULT_OK) {             
            Uri selectedImage = intent.getData();

            String[] filePathColumn = {MediaStore.Images.Media.DATA};
            Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
            cursor.moveToFirst();
            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            filePath = cursor.getString(columnIndex);

            //display image using BitmapFactory

            cursor.close(); bmp = BitmapFactory.decodeFile(filepath); 
            iv.setBackgroundResource(0);
            iv.setImageBitmap(bmp);
        }
    }
}
1
Angel

BitmapFactory.decodeResource() skaliert die Bitmap automatisch, sodass Ihre Bitmap möglicherweise unscharf wird. Gehen Sie folgendermaßen vor, um eine Skalierung zu verhindern:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inScaled = false;
Bitmap source = BitmapFactory.decodeResource(context.getResources(),
                                             R.drawable.resource_name, options);

oder

InputStream is = context.getResources().openRawResource(R.drawable.resource_name)
bitmap = BitmapFactory.decodeStream(is);
1
John Doe

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

Aus Kotlin

val bitmap = myDrawable.toBitmap()
0
MyDogTom