有没有一种方法可以将图像作为位图加载到Glide中?

46

我正在寻找一种将位图用作Glide输入的方法。我甚至不确定是否可能。这是为了调整大小。Glide具有很好的缩放图像增强功能。问题在于我已经将位图资源加载到内存中。我能找到的唯一解决方案是将图像存储到临时文件中,然后将它们作为inputStream / file重新加载到Glide中。有更好的方法实现吗?

在回答之前,请注意...我不是在谈论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());
        }
我希望避免将图像写入内部并再次加载它们。这就是我询问是否有方法可以将输入作为位图的原因。
谢谢。

1
你想通过这个实现什么目标? - Drilon Blakqori
我在问题中写道...缩放...我没有找到比Glide更好的图像缩放方式。 - Maher Abuthraa
但是具体来说,你的使用情况是什么? - Drilon Blakqori
我没有减1,而且不是很清楚,因为您可以根据想要实现的目标以许多方式缩放和处理图像。 - Drilon Blakqori
我尝试了数十种缩放方法.. 最佳的是 Glide。 - Maher Abuthraa
13个回答

79

对于版本4,您需要在调用load()之前调用asBitmap()

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


11
哦,Glide,为什么要做出那样的更改,导致人们需要寻找错误数小时:/ - mcy
什么是 SimpleTarget - Alston
asBitmap 应该在 load 方法之后。 - Dante
用CustomTarget替换SimpleTarget并实现剩余的方法。 - Advait Saravade
1
SimpleTarget已经被弃用,应该使用CustomTarget进行替换,具体请参考这里 - Dmitry K
显示剩余3条评论

26

这个解决方案适用于 Glide V4。你可以像这样获取位图:

Bitmap bitmap = Glide
    .with(context)
    .asBitmap()
    .load(uri_File_String_Or_ResourceId)
    .submit()
    .get();
注意:这将阻塞当前线程以加载图像。

1
它不起作用... 是否有其他解决方案可以从byte[]获取位图作为输出? - Vipul Chauhan
1
在2021年表现完美。 - Bogdan Android
正是我所需要的。其他95%的答案总是针对加载到ImageView中的。 - lasec0203

19

这是一个非常奇怪的案例,但我们尝试解决它。我正在使用旧版而不是时髦的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);

我不确定这是否能帮助你,但我希望它可以让你更接近解决方案。


仅仅因为我的兴趣,你为什么会遇到这种问题呢?难道你不能直接使用Glide从URL等加载图像吗? - Yurii Tsap
“高效”: 在UI线程上进行I/O?仅为了解压而压缩?使用POC将其挤压通过管道。即使在创建图像时直接在后台调用转换也会更好。 - TWiStErRob
@YuriiTsap 我正在从内存中的视图位图中制作屏幕截图。这些视图不仅仅是图像。 - Maher Abuthraa
@YuriiTsap 我对你的问题有一个解决方案。我使用了XML RPC odoo API,它只返回以base64形式表示的图片的JSON字符串格式。 - Ashish Sahu

13

根据最新版本的Glide,变化不大。现在我们需要使用submit()将图像作为位图加载,如果您不调用submit(),则监听器将不会被调用。

这里是我今天使用的工作示例。

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

它正在工作,我从监听器中获取位图。


7
请使用实现来完成操作,即:

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

6

大部分Glide的API和方法现已被弃用。以下适用于Glide 4.9及Android 10以前版本。

对于图像URI

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

在build.gradle中按照以下方式使用Glide

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

3
该方法返回错误以将其运行到后台线程。 - Faraz Tariq

5
已接受的答案适用于旧版本,但在新版本的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);

礼貌


不要在单个请求中使用setDefaultRequestOptions。它只有在您想要在特定的Activity或Fragment中应用相同选项时才有用。要将选项应用于特定请求,请使用.apply(RequestOptions):http://bumptech.github.io/glide/doc/options.html#requestoptions - Sam Judd

4

这里有另一种解决方案,它会返回一个位图,以便您将其设置到 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);
                }
            });

3

这在最近版本的Glide中对我非常有效:

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

2

就我所知,根据以上帖子,我的方法如下:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接