web-dev-qa-db-fra.com

Comment convertir un Drawable en Bitmap?

Je souhaite définir un certain Drawable comme papier peint de l'appareil, mais toutes les fonctions de papier peint acceptent uniquement Bitmaps. Je ne peux pas utiliser WallpaperManager parce que je suis en version 2.1.

De plus, mes tirables sont téléchargés à partir du Web et ne résident pas dans R.drawable.

894
Rob

Cela convertit un BitmapDrawable en un Bitmap.

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

Ce morceau de code aide.

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

Voici une version où l'image est téléchargée.

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é

Un Drawable peut être dessiné sur un Canvas, et un Canvas peut être sauvegardé par un Bitmap:

(Mise à jour pour gérer une conversion rapide pour BitmapDrawables et pour s'assurer que le Bitmap créé a une taille valide)

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: Soit vous pouvez convertir directement en bitmap comme ceci

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

METHODE 2: Vous pouvez même convertir la ressource en dessinable et à partir de là, vous pouvez obtenir un bitmap comme ceci

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

Pour la méthode API> 22getDrawable déplacée dans la classe ResourcesCompat, vous devez donc procéder de la sorte

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

très simple

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

Ainsi, après avoir examiné (et utilisé) les autres réponses, il semble que tous gèrent mal ColorDrawable et PaintDrawable. (Surtout sur Lollipop) semblait que Shaders avaient été modifiés, de sorte que les blocs de couleurs vifs ne soient pas gérés correctement.

J'utilise maintenant le code suivant:

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

Contrairement aux autres, si vous appelez setBounds sur le Drawable avant de demander de le transformer en bitmap, il dessine le bitmap à la taille correcte!

14
Chris.Jenkins

Peut-être que cela aidera quelqu'un ...

De PictureDrawable à Bitmap, utilisez:

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

... mis en œuvre en tant que tel:

Bitmap bmp = pictureDrawableToBitmap((PictureDrawable) drawable);
13
Mauro

Voici une meilleure résolution

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 de Comment lire les bits pouvant être dessinés en tant que InputStream

11
Dawid Drozd

Voici la version de Nice Kotlin de la réponse fournie par @ Chris.Jenkins ici: 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 fournit une solution non directe: BitmapDrawable. Pour obtenir le bitmap, nous devrons fournir l'ID de ressource R.drawable.flower_pic au a BitmapDrawable, puis le convertir en Bitmap.

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

Utilisez ce code.il vous aidera à atteindre votre objectif.

 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 peut convertir des images bitmap en drawable ou en base64 et inversement.

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

La mise en oeuvre

Au niveau du projet

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

Niveau d'application

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

Vous pouvez également stocker et récupérer des images bitmaps/drawables/base64 à partir de sources externes.

Vérifiez ici. https://github.com/1AboveAll/ImageWorker/edit/master/README.md

1
Himanshu Rawat

si vous utilisez Kotlin, utilisez le code ci-dessous. ça va marcher

// pour utiliser le chemin de l'image

val image = Drawable.createFromPath(path)
val bitmap = (image as BitmapDrawable).bitmap
1
Sachidananda Sahu
 // 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() redimensionne automatiquement le bitmap, de sorte que votre bitmap peut devenir flou. Pour empêcher la mise à l'échelle, procédez comme suit:

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

ou

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

Android-ktx a la méthode Drawable.toBitmap: https://Android.github.io/Android-ktx/core-ktx/androidx.graphics.drawable/Android.graphics.drawable.-drawable/to- bitmap.html

De Kotlin

val bitmap = myDrawable.toBitmap()
0
MyDogTom