Télécharger une URL dans un ImageView
est très facile avec Glide:
Glide
.with(context)
.load(getIntent().getData())
.placeholder(R.drawable.ic_loading)
.centerCrop()
.into(imageView);
Je me demande si je peux aussi télécharger dans un Bitmap
? Je voudrais télécharger dans un bitmap brut que je peux ensuite manipuler à l'aide d'autres outils. J'ai parcouru le code et je ne vois pas comment le faire.
Assurez-vous que vous êtes sur le dernière version
implementation 'com.github.bumptech.glide:glide:4.9.0'
Kotlin:
Glide.with(this)
.asBitmap()
.load(imagePath)
.into(object : CustomTarget<Bitmap>(){
override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
imageView.setImageBitmap(resource)
}
override fun onLoadCleared(placeholder: Drawable?) {
// this is called when imageView is cleared on lifecycle call or for
// some other reason.
// if you are referencing the bitmap somewhere else too other than this imageView
// clear it here as you can no longer have the bitmap
}
})
Taille du bitmap:
si vous voulez utiliser la taille originale de l'image, utilisez le constructeur par défaut comme ci-dessus, sinon Vous pouvez passer votre taille souhaitée pour bitmap
into(object : CustomTarget<Bitmap>(1980, 1080)
Java:
Glide.with(this)
.asBitmap()
.load(path)
.into(new CustomTarget<Bitmap>() {
@Override
public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
imageView.setImageBitmap(resource);
}
@Override
public void onLoadCleared(@Nullable Drawable placeholder) {
}
});
Ancienne réponse:
Avec compile 'com.github.bumptech.glide:glide:4.8.0'
et ci-dessous
Glide.with(this)
.asBitmap()
.load(path)
.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap resource, Transition<? super Bitmap> transition) {
imageView.setImageBitmap(resource);
}
});
Pour compile 'com.github.bumptech.glide:glide:3.7.0'
et ci-dessous
Glide.with(this)
.load(path)
.asBitmap()
.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
imageView.setImageBitmap(resource);
}
});
Maintenant, vous pourriez voir un avertissement SimpleTarget is deprecated
Raison:
La dépréciation de SimpleTarget a pour principal objectif de vous avertir de la manière dont il vous tente de rompre le contrat d'API de Glide. En particulier, rien ne vous oblige à cesser d'utiliser les ressources que vous avez chargées une fois que SimpleTarget est effacé, ce qui peut entraîner des plantages et une corruption graphique.
Le SimpleTarget
peut toujours être utilisé aussi longtemps que vous vous assurez que vous n'utilisez pas le bitmap une fois que l'imageView est effacé.
Je ne connais pas assez bien Glide, mais si vous connaissez la taille cible, vous pouvez utiliser quelque chose comme ceci:
Bitmap theBitmap = Glide.
with(this).
load("http://....").
asBitmap().
into(100, 100). // Width and height
get();
Il semble que vous puissiez réussir -1,-1
et obtenir une image en taille réelle (uniquement à partir de tests, impossible de la voir documentée).
Remarque into(int,int)
renvoie un FutureTarget<Bitmap>
, vous devez donc l'envelopper dans un bloc try-catch couvrant ExecutionException
et InterruptedException
. Voici un exemple plus complet d'implémentation, testé et fonctionnel:
class SomeActivity extends Activity {
private Bitmap theBitmap = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
// onCreate stuff ...
final ImageView image = (ImageView) findViewById(R.id.imageView);
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
Looper.prepare();
try {
theBitmap = Glide.
with(SomeActivity.this).
load("https://www.google.es/images/srpr/logo11w.png").
asBitmap().
into(-1,-1).
get();
} catch (final ExecutionException e) {
Log.e(TAG, e.getMessage());
} catch (final InterruptedException e) {
Log.e(TAG, e.getMessage());
}
return null;
}
@Override
protected void onPostExecute(Void dummy) {
if (null != theBitmap) {
// The full bitmap should be available here
image.setImageBitmap(theBitmap);
Log.d(TAG, "Image loaded");
};
}
}.execute();
}
}
Suivant la suggestion de Monkeyless dans le commentaire ci-dessous (et cela semble être aussi la méthode officielle ), vous pouvez utiliser un SimpleTarget
, éventuellement associé à override(int,int)
pour simplifier considérablement le code. . Cependant, dans ce cas, la taille exacte doit être fournie (tout élément inférieur à 1 n'est pas accepté):
Glide
.with(getApplicationContext())
.load("https://www.google.es/images/srpr/logo11w.png")
.asBitmap()
.into(new SimpleTarget<Bitmap>(100,100) {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) {
image.setImageBitmap(resource); // Possibly runOnUiThread()
}
});
comme suggéré par @hennry si vous aviez besoin de la même image, utilisez new SimpleTarget<Bitmap>()
Il semble que remplacer la classe Target
ou l'une des implémentations telles que BitmapImageViewTarget
et remplacer la méthode setResource
pour capturer le bitmap pourrait être le chemin à parcourir ...
Ceci n'est pas testé. :-)
Glide.with(context)
.load("http://goo.gl/h8qOq7")
.asBitmap()
.into(new BitmapImageViewTarget(imageView) {
@Override
protected void setResource(Bitmap resource) {
// Do bitmap magic here
super.setResource(resource);
}
});
C'est ce qui a fonctionné pour moi: https://github.com/bumptech/glide/wiki/Custom-targets#overriding-default-behavior
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.transition.Transition;
import com.bumptech.glide.request.target.BitmapImageViewTarget;
...
Glide.with(yourFragment)
.load("yourUrl")
.asBitmap()
.into(new BitmapImageViewTarget(yourImageView) {
@Override
public void onResourceReady(Bitmap bitmap, Transition<? super Bitmap> anim) {
super.onResourceReady(bitmap, anim);
Palette.generateAsync(bitmap, new Palette.PaletteAsyncListener() {
@Override
public void onGenerated(Palette palette) {
// Here's your generated palette
Palette.Swatch swatch = palette.getDarkVibrantSwatch();
int color = palette.getDarkVibrantColor(swatch.getTitleTextColor());
}
});
}
});
UPDATE
Maintenant nous devons utiliser Custom Targets
EXEMPLE DE CODE
_ Glide.with(mContext)
.asBitmap()
.load("url")
.into(new CustomTarget<Bitmap>() {
@Override
public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
}
@Override
public void onLoadCleared(@Nullable Drawable placeholder) {
}
});
_
Comment utiliser Glide pour télécharger une image dans un bitmap?
Les réponses ci-dessus sont toutes correctes mais obsolètes
car dans la nouvelle version de Glide _implementation 'com.github.bumptech.glide:glide:4.8.0'
_
Vous trouverez ci-dessous l'erreur dans le code
.asBitmap()
n'est pas disponible dans glide:4.8.0
SimpleTarget<Bitmap>
Voici la solution
_import Android.graphics.Bitmap;
import Android.graphics.Canvas;
import Android.graphics.drawable.BitmapDrawable;
import Android.graphics.drawable.Drawable;
import Android.support.annotation.NonNull;
import Android.support.annotation.Nullable;
import Android.support.v7.app.AppCompatActivity;
import Android.os.Bundle;
import Android.widget.ImageView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.Request;
import com.bumptech.glide.request.RequestOptions;
import com.bumptech.glide.request.target.SizeReadyCallback;
import com.bumptech.glide.request.target.Target;
import com.bumptech.glide.request.transition.Transition;
public class MainActivity extends AppCompatActivity {
ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = findViewById(R.id.imageView);
Glide.with(this)
.load("")
.apply(new RequestOptions().diskCacheStrategy(DiskCacheStrategy.NONE))
.into(new Target<Drawable>() {
@Override
public void onLoadStarted(@Nullable Drawable placeholder) {
}
@Override
public void onLoadFailed(@Nullable Drawable errorDrawable) {
}
@Override
public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
Bitmap bitmap = drawableToBitmap(resource);
imageView.setImageBitmap(bitmap);
// now you can use bitmap as per your requirement
}
@Override
public void onLoadCleared(@Nullable Drawable placeholder) {
}
@Override
public void getSize(@NonNull SizeReadyCallback cb) {
}
@Override
public void removeCallback(@NonNull SizeReadyCallback cb) {
}
@Override
public void setRequest(@Nullable Request request) {
}
@Nullable
@Override
public Request getRequest() {
return null;
}
@Override
public void onStart() {
}
@Override
public void onStop() {
}
@Override
public void onDestroy() {
}
});
}
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;
}
}
_
Si vous souhaitez affecter une image bitmap dynamique à des variables bitmap
Exemple pour kotlin
backgroundImage = Glide.with(applicationContext).asBitmap().load(PresignedUrl().getUrl(items!![position].img)).into(100, 100).get();
Les réponses ci-dessus n'ont pas fonctionné pour moi
.asBitmap
devrait être avant la .load("http://....")
La réponse de @ outlyer est correcte, mais il y a quelques changements dans la nouvelle version de Glide
Ma version: 4.7.1
Code:
Glide.with(context.applicationContext)
.asBitmap()
.load(iconUrl)
.into(object : SimpleTarget<Bitmap>(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL) {
override fun onResourceReady(resource: Bitmap, transition: com.bumptech.glide.request.transition.Transition<in Bitmap>?) {
callback.onReady(createMarkerIcon(resource, iconId))
}
})
Remarque: ce code est exécuté dans le thread d'interface utilisateur. Vous pouvez donc utiliser AsyncTask, Executor ou autre chose pour la concurrence (comme le code de @ outlyer). Si vous souhaitez obtenir la taille d'origine, indiquez Target.SIZE_ORIGINA comme code. Ne pas utiliser -1, -1