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?) {
}
})
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 SimpleTarget
masih dapat digunakan selama Anda memastikan Anda tidak menggunakan bitmap sekali imageView dibersihkan.
4.9.0
.asBitmap()
harus diletakkan setelahwith(this)
jika belum terselesaikan.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 aFutureTarget<Bitmap>
, jadi Anda harus membungkus ini dengan penutup blok coba-tangkapExecutionException
danInterruptedException
. 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 denganoverride(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 gunakan
new SimpleTarget<Bitmap>()
sumber
Target.SIZE_ORIGINAL
lebar dan tinggi bitmap daripada -1SimpleTarget
seperti ini:new SimpleTarget<Bitmap>(){....}
Sepertinya menimpa
Target
kelas atau salah satu implementasi sepertiBitmapImageViewTarget
dan menimpasetResource
metode 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); } });
sumber
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) { } });
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
.asBitmap()
tersedia diglide:4.8.0
sudah ditinggalkanSimpleTarget<Bitmap>
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; } }
sumber
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()); } }); } });
sumber
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://....")
sumber
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
sumber
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 } }) }
sumber
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) } } })
sumber