Je souhaite définir un certain Drawable
comme papier peint de l'appareil, mais toutes les fonctions de papier peint acceptent uniquement Bitmap
s. 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
.
Cela convertit un BitmapDrawable en un Bitmap.
Drawable d = ImagesArrayList.get(0);
Bitmap bitmap = ((BitmapDrawable)d).getBitmap();
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);
}
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;
}
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 BitmapDrawable
s 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;
}
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();
très simple
Bitmap tempBMP = BitmapFactory.decodeResource(getResources(),R.drawable.image);
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 Shader
s 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!
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);
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
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
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();
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;
}
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
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
// 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);
}
}
}
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);
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()