Как использовать glide для загрузки изображения в растровое изображение?



загрузка URL в ImageView очень легко с помощью Glide:



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


мне интересно, если я могу скачать в Bitmap так же? Я хотел бы загрузить в сырое растровое изображение, которое я могу затем манипулировать с помощью других инструментов. Я просмотрел код и не вижу, как это сделать.

814   6  

6 ответов:

Я недостаточно знаком с Glide, но похоже, что если вы знаете размер цели, вы можете использовать что-то вроде этого:

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

похоже, вы можете пройти -1,-1, и получить полноразмерное изображение (чисто на основе тестов, не могу увидеть его документально).

Примечание into(int,int) возвращает a FutureTarget<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

если вы хотите назначить динамическое растровое изображение для растровых переменных

пример kotlin

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

приведенные выше ответы не работают для меня

.asBitmap должно быть перед .load("http://....")

Comments

    Ничего не найдено.