【问题标题】:How to get a Bitmap from an ImageView如何从 ImageView 中获取位图
【发布时间】:2016-12-31 00:52:27
【问题描述】:

我希望从带有GlideImageView 中获取Bitmap,如下所示:

Glide.with(getContext()).load(URL)
            .thumbnail(0.5f)
            .crossFade()
            .diskCacheStrategy(DiskCacheStrategy.ALL)
            .into(my_imageView);

我尝试了以下方法:

imageView.buildDrawingCache();
Bitmap bmap = imageView.getDrawingCache();

BitmapDrawable drawable = (BitmapDrawable) imageView.getDrawable();
Bitmap bitmap = drawable.getBitmap();

到目前为止,没有一个对我有用。

如何做到这一点?

【问题讨论】:

  • 我不知道 Glide,但最好的答案是从 Glide 获取位图。如果这不可能,请创建一个适当大小的Bitmap,将其包裹在Canvas 中,然后将ImageViewdraw() 联系到CanvasBitmap 将包含结果。

标签: android bitmap


【解决方案1】:

哦,这是一个简单的错误。您需要在尝试从 ImageView 中获取 Bitmap 的代码之前添加它:

imageView.setDrawingCacheEnabled(true);

为了使用DrawingCache从ImageView中取出Bitmap,首先需要enableImageView来绘制图片缓存。

然后:

Bitmap bmap = imageView.getDrawingCache();

另外,调用buildDrawingCache(); 等同于调用buildDrawingCache(false);

【讨论】:

  • 这有帮助,但是当我在ImageView 中加载新图片并显示它时,它会显示保存的第一个位图。是缓存造成的吗?
  • 你为什么不尝试使用 imageView.destroyDrawingCache();在设置其他图像之前。
  • 很高兴听到这个消息。 :)
【解决方案2】:

我遇到的问题是位图仍然总是导致 null (即使使用绘图缓存,可能与 Facebook ShareButton/ShareContent 竞争)所以我有以下解决方案来确保滑翔完成加载图像:

添加一个监听器来滑行

Glide.with(this)
        .load(url)
        .listener(listener)
        .into(imageView);

聆听者

private RequestListener listener = new RequestListener() {
    ...

    @Override
    public boolean onResourceReady(Object resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) {

        Bitmap bitmap = ((BitmapDrawable) resource).getBitmap();
        return false;
    }
};

【讨论】:

  • 如果你使用 Glide .asBitmap(),你可以很容易地避免在监听器内部投射
【解决方案3】:

目前setDrawingCacheEnabled弃用,因此另一种解决方案是使用

ImageView imageView = findViewById(R.id.image);
Bitmap bitmap = ((BitmapDrawable)imageView.getDrawable()).getBitmap();

或者从Uri获取Bitmap,我们可以使用Glide库。

Bitmap bitmap = Glide.with(this) //taking as bitmap
                     .load(uri //Uri)
                     .asBitmap()
                     .into(100, 100) //width and height
                     .get();

使用 Glide 非常适合处理bitmaps。请参阅Handling Bitmaps 的文档

【讨论】:

    【解决方案4】:

    情况发生了变化,这里的答案需要更新。所以这是我在 kotlin 中的解决方案。这是简化的,没有合成或视图绑定(呵呵)。

        val imageView : ImageView = findViewById(R.id.my_imageview)
        val bitmap : Bitmap = imageView.drawable.toBitmap()
    

    在执行此操作之前,您需要确保 ImageView 有时间进行绘制。 onViewCreated() 在片段中或单击事件之后是执行此操作的好时机。开销不应该太多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-04
      • 2015-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-17
      相关资源
      最近更新 更多