Bagaimana seseorang menggunakan glide untuk mendownload gambar menjadi bitmap?

146

Mengunduh URL menjadi ImageViewsangat mudah menggunakan Glide:

Glide
   .with(context)
   .load(getIntent().getData())
   .placeholder(R.drawable.ic_loading)
   .centerCrop()
   .into(imageView);

Saya ingin tahu apakah saya dapat mengunduh ke a Bitmapjuga? Saya ingin mengunduh ke bitmap mentah yang kemudian dapat saya manipulasi menggunakan alat lain. Saya telah mempelajari kode dan tidak tahu bagaimana melakukannya.

JohnnyLambada
sumber

Jawaban:

189

Pastikan Anda menggunakan versi terbaru

implementation 'com.github.bumptech.glide:glide:4.10.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
            }
        })

Ukuran Bitmap:

jika Anda ingin menggunakan ukuran asli gambar gunakan konstruktor default seperti di atas, jika tidak Anda dapat meneruskan ukuran yang Anda inginkan untuk bitmap

into(object : CustomTarget<Bitmap>(1980, 1080)

Jawa:

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

Jawaban Lama:

Dengan compile 'com.github.bumptech.glide:glide:4.8.0'dan di bawah

Glide.with(this)
        .asBitmap()
        .load(path)
        .into(new SimpleTarget<Bitmap>() {
            @Override
            public void onResourceReady(Bitmap resource, Transition<? super Bitmap> transition) {
                imageView.setImageBitmap(resource);
            }
        });

Untuk compile 'com.github.bumptech.glide:glide:3.7.0'dan di bawah

Glide.with(this)
        .load(path)
        .asBitmap()
        .into(new SimpleTarget<Bitmap>() {
            @Override
            public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
                imageView.setImageBitmap(resource);
            }
        });

Sekarang Anda mungkin melihat peringatan SimpleTarget is deprecated

Alasan:

Poin utama penghentian SimpleTarget adalah untuk memperingatkan Anda tentang cara-cara yang menggoda Anda untuk memutuskan kontrak API Glide. Secara khusus, itu tidak melakukan apa pun untuk memaksa Anda berhenti menggunakan sumber daya apa pun yang telah Anda muat setelah SimpleTarget dihapus, yang dapat menyebabkan kerusakan dan kerusakan grafis.

The SimpleTargetmasih dapat digunakan selama Anda memastikan Anda tidak menggunakan bitmap sekali imageView dibersihkan.

Max
sumber
10
Saya menggunakan Glide 4.0 dan sepertinya tidak dapat menemukan .asBitmap ()
Chris Nevill
9
Untuk panggilan sinkron, gunakan Glide.with (this) .asBitmap (). Load (pictureUrl) .submit (100, 100) .get (). Ini dapat berguna ketika Anda ingin menambahkan ikon dalam notifikasi melalui .setLargeIcon (bitmap)
Yazon2006
1
@Max pekerjaan ini untuk saya dalam implementasi 'com.github.bumptech.glide: glide: 3.6.1'
Bipin Bharti
2
@Nux pastikan Anda menggunakan versi terbaru4.9.0
Max
1
.asBitmap()harus diletakkan setelah with(this)jika belum terselesaikan.
Alston
183

Saya tidak cukup paham dengan Glide, tetapi sepertinya jika Anda mengetahui ukuran target, Anda dapat menggunakan sesuatu seperti ini:

Bitmap theBitmap = Glide.
        with(this).
        load("http://....").
        asBitmap().
        into(100, 100). // Width and height
        get();

Sepertinya Anda bisa lulus -1,-1, dan mendapatkan gambar ukuran penuh (murni berdasarkan tes, tidak bisa melihatnya didokumentasikan).

Note into(int,int)mengembalikan a FutureTarget<Bitmap>, jadi Anda harus membungkus ini dengan penutup blok coba-tangkap ExecutionExceptiondan InterruptedException. Berikut contoh implementasi yang lebih lengkap, diuji dan berfungsi:

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

Mengikuti saran Monkeyless dalam komentar di bawah (dan ini tampaknya juga cara resmi ), Anda dapat menggunakan SimpleTarget, secara opsional digabungkan dengan override(int,int)untuk menyederhanakan kode secara signifikan. Namun, dalam kasus ini ukuran persisnya harus diberikan (apa pun di bawah 1 tidak diterima):

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

seperti yang disarankan oleh @hennry jika Anda membutuhkan gambar yang sama, maka gunakannew SimpleTarget<Bitmap>()

outlyer
sumber
4
Untuk anak cucu, Anda tidak memerlukan tugas asinkron, cukup gunakan .override (int, int) dan / atau SimpleTarget
Sam Judd
2
@Monkeyless terima kasih, saya telah memperluas jawaban saya untuk menyertakan saran Anda.
outlyer
33
Jika Anda ingin mendapatkan bitmap dalam ukuran aslinya, lebih baik berikan Target.SIZE_ORIGINALlebar dan tinggi bitmap daripada -1
Alex Bonel
5
Anda akan mendapatkan bitmap ukuran penuh jika Anda tidak memberikan parameter SimpleTargetseperti ini:new SimpleTarget<Bitmap>(){....}
Henry
3
Di Glide 4.0.0+ gunakan .asBitmap () before.load () dan .submit (100, 100) alih-alih .into (100, 100)
Yazon2006
16

Sepertinya menimpa Targetkelas atau salah satu implementasi seperti BitmapImageViewTargetdan menimpa setResourcemetode untuk menangkap bitmap mungkin merupakan cara yang tepat ...

Ini belum teruji. :-)

    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);
                     }
         });
blad
sumber
3
Apakah Bitmap tidak akan mengambil lebar / tinggi imageView? Saya berharap mendapatkan Bitmap asli yang tidak diubah.
JohnnyLambada
Untuk Glide 4.0.0+ gunakan .asBitmap () before.load ()
Saeed
10

MEMPERBARUI

Sekarang kita perlu menggunakan Custom Targets

KODE SAMPEL

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

Bagaimana seseorang menggunakan glide untuk mendownload gambar menjadi bitmap?

Jawaban di atas semua benar tetapi ketinggalan zaman

karena dalam versi baru Glide implementation 'com.github.bumptech.glide:glide:4.8.0'

Anda akan menemukan kesalahan di bawah kode

  • Tidak .asBitmap()tersedia diglide:4.8.0

masukkan deskripsi gambar di sini

  • SimpleTarget<Bitmap> sudah ditinggalkan

masukkan deskripsi gambar di sini

Inilah solusinya

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;
    }
}
AskNilesh
sumber
Jika Anda mencoba asBItmap sebelum .load sehingga tidak akan memberikan kesalahan apa pun
Vipul Chauhan
@Spritzig masalah apa yang Anda hadapi sekarang
AskNilesh
@NileshRathod Itu tidak menunjukkan saya ikon tidak ada kesalahan apa pun tetapi hanya tidak menunjukkan ikon.
Abedin.Zhuniqi
@NileshRathod Apakah Anda menemukan masalah untuk ini?
Abedin.Zhuniqi
7

Inilah yang berhasil bagi saya: https://github.com/bumptech/glide/wiki/Custom-target#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());
            }
        });
    }
});
Stephen Kaiser
sumber
4

Jika Anda ingin menetapkan gambar bitmap dinamis ke variabel bitmap

Contoh untuk kotlin

backgroundImage = Glide.with(applicationContext).asBitmap().load(PresignedUrl().getUrl(items!![position].img)).into(100, 100).get();

Jawaban di atas tidak berhasil untuk saya

.asBitmap harus sebelum .load("http://....")

ramana vv
sumber
4
.into (100, 100) sudah tidak digunakan lagi .submit (100, 100)
Yazon2006
mengapa f glide menghilangkan hal-hal seperti ini? ini praktis penggunaan yang sama ...
kkarakk
2

UPDATE UNTUK VERSI BARU

Glide.with(context.applicationContext)
    .load(url)
    .listener(object : RequestListener<Drawable> {
        override fun onLoadFailed(
            e: GlideException?,
            model: Any?,
            target: Target<Drawable>?,
            isFirstResource: Boolean
        ): Boolean {
            listener?.onLoadFailed(e)
            return false
        }

        override fun onResourceReady(
            resource: Drawable?,
            model: Any?,
            target: com.bumptech.glide.request.target.Target<Drawable>?,
            dataSource: DataSource?,
            isFirstResource: Boolean
        ): Boolean {
            listener?.onLoadSuccess(resource)
            return false
        }

    })
    .into(this)

JAWABAN LAMA

Jawaban @ outlyer benar, tetapi ada beberapa perubahan dalam versi Glide yang baru

Versi saya: 4.7.1

Kode:

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

Catatan: kode ini berjalan di UI Thread, sehingga Anda dapat menggunakan AsyncTask, Executor atau hal lain untuk konkurensi (seperti kode @ outlyer) Jika Anda ingin mendapatkan ukuran asli, masukkan Target.SIZE_ORIGINA sebagai kode saya. Jangan gunakan -1, -1

Mạnh Hoàng Huynh
sumber
4
SimpleTarget <Bitmap> tidak digunakan lagi dalam versi baru
Nainal
1

Cara Kotlin -

fun Context.bitMapFromImgUrl(imageUrl: String, callBack: (bitMap: Bitmap) -> Unit) {
    GlideApp.with(this)
        .asBitmap()
        .load(imageUrl)
        .into(object : CustomTarget<Bitmap>() {
            override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
                callBack(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
            }
        })
}
Anoop M
sumber
0

Versi terbaru:

GlideApp.with(imageView)
    .asBitmap()
    .override(200, 200)
    .centerCrop()
    .load(mUrl)
    .error(R.drawable.defaultavatar)
    .diskCacheStrategy(DiskCacheStrategy.ALL)
    .signature(ObjectKey(System.currentTimeMillis() / (1000*60*60*24))) //refresh avatar cache every day
    .into(object : CustomTarget<Bitmap>(){
        override fun onLoadCleared(placeholder: Drawable?) {}
        override fun onLoadFailed(errorDrawable: Drawable?) {
            //add context null check in case the user left the fragment when the callback returns
            context?.let { imageView.addImage(BitmapFactory.decodeResource(resources, R.drawable.defaultavatar)) }
        }
        override fun onResourceReady(
            resource: Bitmap,
            transition: Transition<in Bitmap>?) { context?.let { imageView.addImage(resource) } }
    })
mrj
sumber