Есть ли способ загрузить изображение как растровое изображение в Glide?

Я ищу способ использовать растровое изображение в качестве входных данных для Glide. Я даже не уверен, возможно ли это. Это для изменения размера. Glide имеет хорошее улучшение изображения с масштабом. Проблема в том, что у меня есть ресурсы в виде растрового изображения, уже загруженные в память. Единственное решение, которое я смог найти, - это сохранить изображения во временном файле и загрузить их обратно в Glide как inputStream/file. Есть ли лучший способ добиться этого?

Пожалуйста, прежде чем ответить.. Я не говорю о выходе из Glide.. .asBitmap().get() Я знаю это. Мне нужна помощь с вводом.

Вот мое обходное решение:

 Bitmap bitmapNew=null;
        try {
            //
            ContextWrapper cw = new ContextWrapper(ctx);
            File directory = cw.getDir("imageDir", Context.MODE_PRIVATE);
            File file=new File(directory,"temp.jpg");
            FileOutputStream fos = new FileOutputStream(file);
            bitmap.compress(Bitmap.CompressFormat.PNG, 90, fos);
            fos.close();
            //
            bitmapNew = Glide
                    .with(ctx)
                    .load(file)
                    .asBitmap()
                    .diskCacheStrategy(DiskCacheStrategy.NONE)
                    .skipMemoryCache(true)
                    .into( mActualWidth, mActualHeight - heightText)
                    .get();

            file.delete();
        } catch (Exception e) {
            Logcat.e( "File not found: " + e.getMessage());
        }

Я хотел бы избежать записи изображений во внутреннюю и загружать их снова. По этой причине я спрашиваю, есть ли способ сделать ввод в виде растрового изображения

Спасибо

13 ответов

Решение

Действительно странный случай, но давайте попробуем его решить. Я пользуюсь старым и не крутым PicassoНо однажды я попробую Glide. Вот несколько ссылок, которые могут вам помочь:

И на самом деле жестокий, но я думаю, эффективный способ решить эту проблему:

ByteArrayOutputStream stream = new ByteArrayOutputStream();
  yourBitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
  Glide.with(this)
      .load(stream.toByteArray())
      .asBitmap()
      .error(R.drawable.ic_thumb_placeholder)
      .transform(new CircleTransform(this))
      .into(imageview);

Я не уверен, поможет ли это вам, но я надеюсь, что это может сделать вас на шаг ближе к решению.

Для версии 4 вы должны позвонить asBitmap() до load()

GlideApp.with(itemView.getContext())
        .asBitmap()
        .load(data.getImageUrl())
        .into(new SimpleTarget<Bitmap>() {
            @Override
            public void onResourceReady(Bitmap resource, Transition<? super Bitmap> transition) {}
            });
        }

Дополнительная информация: http://bumptech.github.io/glide/doc/targets.html

Это решение работает с Glide V4. Вы можете получить растровое изображение следующим образом:

Bitmap bitmap = Glide
    .with(context)
    .asBitmap()
    .load(uri_File_String_Or_ResourceId)
    .submit()
    .get();

Примечание: это заблокирует текущий поток для загрузки изображения.

Есть небольшие изменения в соответствии с последней версией Glide, Теперь нам нужно использовать submit() загрузить изображение как растровое изображение, если вы не класс submit() чем слушатель не будет вызван.

Вот рабочий пример, который я использовал сегодня.

<!-- begin snippet: js hide: false console: true babel: false -->

Glide.with(cxt)
  .asBitmap().load(imageUrl)
  .listener(new RequestListener<Bitmap>() {
      @Override
      public boolean onLoadFailed(@Nullable GlideException e, Object o, Target<Bitmap> target, boolean b) {
          Toast.makeText(cxt,getResources().getString(R.string.unexpected_error_occurred_try_again),Toast.LENGTH_SHORT).show();
          return false;
      }

      @Override
      public boolean onResourceReady(Bitmap bitmap, Object o, Target<Bitmap> target, DataSource dataSource, boolean b) {
          zoomImage.setImage(ImageSource.bitmap(bitmap));
          return false;
      }
  }
).submit();

Это работает, и я получаю растровое изображение от слушателя.

Пожалуйста, используйте реализацию для этого:

реализация 'com.github.bumptech.glide:glide:4.9.0'

     Glide.with(this)
     .asBitmap()
      .load("http://url")
    .into(new CustomTarget <Bitmap>() {   
@Override  
public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition <? super Bitmap> transition) { 
                // you can do something with loaded bitmap here

 }
@Override 
public void onLoadCleared(@Nullable Drawable placeholder) { 
 } 
});

Большинство API и методов Glide теперь устарели. Ниже работает для Glide 4.9 и до Android 10.

Для URI изображения

  Bitmap bitmap = Glide
    .with(context)
    .asBitmap()
    .load(image_uri_or_drawable_resource_or_file_path)
    .submit()
    .get();

Используйте Glide, как показано ниже, в build.gradle

implementation 'com.github.bumptech.glide:glide:4.9.0'

Принятый ответ работает для предыдущих версий, но в новых версиях Glide:

RequestOptions requestOptions = new RequestOptions();
requestOptions.placeholder(android.R.drawable.waiting);
requestOptions.error(R.drawable.waiting);
Glide.with(getActivity()).apply(requestOptions).load(imageUrl).into(imageView);

учтивость

Вот еще одно решение, которое возвращает вам растровое изображение для установки в вашем ImageView

Glide.with(this)
            .load(R.drawable.card_front)    // you can pass url too
            .asBitmap()
            .into(new SimpleTarget<Bitmap>() {
                @Override
                public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
                    // you can do something with loaded bitmap here

                    imgView.setImageBitmap(resource);
                }
            });

Это сработало для меня в последней версии Glide:

Glide.with(this)
        .load(bitmap)
        .dontTransform()
        .into(imageView);

Обновленный ответ 2021 авг.

      Glide.with(context)
      .asBitmap()
      .load(uri)
      .into(new CustomTarget<Bitmap>() {
          @Override
          public void onResourceReady(@NonNull Bitmap resource, Transition<? super Bitmap> transition) {
              useIt(resource);
          }

          @Override
          public void onLoadCleared(@Nullable Drawable placeholder) {
          }
      });

onResourceReady : метод, который будет вызываться после завершения загрузки ресурса.
параметр - загруженный ресурс.

onLoadCleared : обязательный обратный вызов жизненного цикла, который вызывается, когда загрузка отменяется и ее ресурсы освобождаются. Вы должны убедиться, что любой текущий Drawable, полученный вonResourceReady , больше не используется, прежде чем перерисовывать контейнер (обычно View) или изменять его видимость.
Параметр - это заполнитель, который можно отобразить при желании, или значение null.

Для чего стоит, основываясь на постах выше, мой подход:

     Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart");
Uri imageUri = Uri.withAppendedPath(sArtworkUri, String.valueOf(album_id));

затем в адаптер:

        //  loading album cover using Glide library

    Glide.with(mContext)
            .asBitmap()
            .load(imageUri)
            .into(holder.thumbnail);

на 2021 год:

        val bitmap=Glide.with(this).asBitmap().load(imageUri).submit().get()

В Котлине

Glide.with(this)
            .asBitmap()
            .load("https://...")
            .addListener(object : RequestListener<Bitmap> {
                override fun onLoadFailed(
                    e: GlideException?,
                    model: Any?,
                    target: Target<Bitmap>?,
                    isFirstResource: Boolean
                ): Boolean {
                    Toast.makeText(this@MainActivity, "failed: " + e?.printStackTrace(), Toast.LENGTH_SHORT).show()
                    return false
                }

                override fun onResourceReady(
                    resource: Bitmap?,
                    model: Any?,
                    target: Target<Bitmap>?,
                    dataSource: DataSource?,
                    isFirstResource: Boolean
                ): Boolean {
                    //image is ready, you can get bitmap here
                    return false
                }

            })
            .into(imageView)
Другие вопросы по тегам