Как использовать glide для загрузки изображения в растровое изображение?
загрузка URL в ImageView очень легко с помощью Glide:
Glide
.with(context)
.load(getIntent().getData())
.placeholder(R.drawable.ic_loading)
.centerCrop()
.into(imageView);
мне интересно, если я могу скачать в Bitmap так же? Я хотел бы загрузить в сырое растровое изображение, которое я могу затем манипулировать с помощью других инструментов. Я просмотрел код и не вижу, как это сделать.
6 ответов:
Я недостаточно знаком с Glide, но похоже, что если вы знаете размер цели, вы можете использовать что-то вроде этого:
Bitmap theBitmap = Glide. with(this). load("http://...."). asBitmap(). into(100, 100). // Width and height get();похоже, вы можете пройти
-1,-1, и получить полноразмерное изображение (чисто на основе тестов, не могу увидеть его документально).Примечание
into(int,int)возвращает aFutureTarget<Bitmap>, так что вы должны обернуть это в try-catch блок, охватывающийExecutionExceptionиInterruptedException. Вот более полный пример реализации, тестирование и рабочий: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(); } }
следуя предложению Monkeyless в комментарии ниже (и похоже, это тоже официальный способ), вы можете использовать
SimpleTargetпри необходимости в сочетании сoverride(int,int)значительно упростить код. Однако в этом случае должен быть указан точный размер (что-либо ниже 1 не принимается):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() } });как предложил @hennry если вам требуется то же самое изображение, то используйте
new SimpleTarget<Bitmap>()
Ну с последней скольжения версия
compile 'com.github.bumptech.glide:glide:4.0.0'и выше, вам не нужно предоставлять размер или что-то еще, теперь это довольно просто, какGlide.with(this) .asBitmap() .load(path) .into(new SimpleTarget<Bitmap>() { @Override public void onResourceReady(Bitmap resource, Transition<? super Bitmap> transition) { imageView.setImageBitmap(resource); } });и для версий
compile 'com.github.bumptech.glide:glide:3.7.0'и старшегоGlide.with(this) .load(path) .asBitmap() .into(new SimpleTarget<Bitmap>() { @Override public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) { imageView.setImageBitmap(resource); } });
похоже на переопределение
Targetкласс или одна из реализаций типаBitmapImageViewTargetи переопределитьsetResourceметод для захвата растрового изображения может быть путь...это непроверенно. : -)
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); } });
Это то, что сработало для меня: 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()); } }); } });
@outlyer ответ правильный, но есть некоторые изменения в новой версии Glide
моя версия: 4.7.1
код:
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)) } })Примечание: этот код выполняется в потоке пользовательского интерфейса, поэтому вы можете использовать AsyncTask, Executor или что-то еще для параллелизма (например, код @outlyer) Если вы хотите получить оригинальный размер, поставьте цель.SIZE_ORIGINA как мой код. Не используйте -1, -1
если вы хотите назначить динамическое растровое изображение для растровых переменных
пример
kotlinbackgroundImage = Glide.with(applicationContext).asBitmap().load(PresignedUrl().getUrl(items!![position].img)).into(100, 100).get();приведенные выше ответы не работают для меня
.asBitmapдолжно быть перед.load("http://....")
Comments