从Fresco获取BitmapDrawable

3

我想获取SimpleDraweeView中的位图。

我已经使用uri图像设置了我的SimpleDraweeView:

final Uri uri = new Uri.Builder()
                    .scheme(UriUtil.LOCAL_RESOURCE_SCHEME)
                    .path(returnUri.getPath())
                    .build();
            profileImage.setImageURI(returnUri);

现在,我正在尝试将图片保存在手机的存储器中。

 Bitmap b = ((BitmapDrawable) profileImage.getDrawable()).getBitmap(); //  ImageDiskHelper.drawableToBitmap(profileImage.getDrawable().get);
        try {
            ImageDiskHelper.saveToInternalStorage(b, "MyActualProfileImage");
        } catch(Exception c){ }

但是如果我使用上面的代码,会出现以下错误:com.facebook.drawee.generic.RootDrawable无法转换为android.graphics.drawable.BitmapDrawable

当我将profileImage.getDrawable转换为位图时,图像如下:空白图像

我正在尝试获取SimpleDraweeView显示的位图


为什么你想要做这个?Fresco已经为你管理了所有的缓存等等。 - Alexander Oprisnik
@AlexanderOprisnik 我能想到的一个好理由是,在UI测试中,访问位图可绘制对象非常有用,但为了做到这一点,似乎需要从常规可绘制对象开始,而我不知道如何进行强制转换。 - Nick Cardoso
因为我想让用户看到一些图片,然后将其保存到存储中。 - Dex Sebas
2个回答

1
我认为它可以帮助你。
SimpleDraweeView view = findView(R.id.pic);
view.setDrawingCacheEnabled(true);
view.buildDrawingCache();
Bitmap bitmap = view.getDrawingCache();
if (bitmap != null) {
    dominantColor = getDominantColor(bitmap);
}

也许这不是最美的解决方案,但对我来说很有效。

1
获取位图drawable并不是一个好主意,因为Fresco的底层实现可能会在未来发生更改,这将破坏您的代码。
我猜你真正想要的是原始编码的图像字节(这样你就不必重新编码图像了)。 您可以使用以下方式获取已编码的图像字节: DataSource<CloseableReference<PooledByteBuffer>> dataSource = imagePipeline.fetchEncodedImage(imageRequest, callerContext); 由于您之前已经提取了图像,因此它应该立即可用,您可以执行以下操作:
try {
  CloseableReference<PooledByteBuffer> encodedImage = dataSource.getResult();
  if (imageReference != null) {
    try {
      // Do something with the encoded image, but do not keep the reference to it!
      // The image may get recycled as soon as the reference gets closed below.
    } finally {
      CloseableReference.closeSafely(encodedImage);
    }
  } else {
    // cache miss
    ...
  }
} finally {
  dataSource.close();
}

不要忘记关闭引用,以防内存泄漏。你可以在这里找到更多信息。

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