web-dev-qa-db-fra.com

Comment utiliser Glide pour télécharger une image dans un bitmap?

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.

112
JohnnyLambada

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é.

107
Max

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>()

172
outlyer

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);
                     }
         });
15
blad

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());
            }
        });
    }
});
7
Stephen Kaiser

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

  • Le .asBitmap() n'est pas disponible dans glide:4.8.0

enter image description here

  • SimpleTarget<Bitmap> est obsolète

enter image description here

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;
    }
}
_
6
Nilesh Rathod

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://....")

2
ramana vv

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

2