从壁画中获取bitmapdrawable

时间:2016-08-03 21:58:43

标签: java android fresco

我正在尝试从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转换为位图图像是这样的:empty image

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

2 个答案:

答案 0 :(得分:1)

我认为它可以帮助你。

SimpleDraweeView view = findView(R.id.pic);
view.setDrawingCacheEnabled(true);
view.buildDrawingCache();
Bitmap bitmap = view.getDrawingCache();
if (bitmap != null) {
    dominantColor = getDominantColor(bitmap);
}

也许这不是很好的解决方案,但对我来说效果很好。

答案 1 :(得分:0)

获取位图可绘制并不是一个好主意,因为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();
}

不要忘记关闭引用,以免泄漏内存。 您可以找到更多信息here