Java 从壁画中获取位图绘制

Java 从壁画中获取位图绘制,java,android,fresco,Java,Android,Fresco,我正在尝试从SimpleDraweView获取位图 我已经用uri图像设置了SimpleDraweView: final Uri uri = new Uri.Builder() .scheme(UriUtil.LOCAL_RESOURCE_SCHEME) .path(returnUri.getPath()) .build(); profileImage.

我正在尝试从SimpleDraweView获取位图

我已经用uri图像设置了SimpleDraweView:

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转换为位图图像如下:


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

获取可绘制的位图不是一个好主意,因为Fresco的底层实现将来可能会发生变化,这将破坏您的代码

我猜您真的只需要原始编码的图像字节(这样您就不必重新编码图像)。 您可以使用

数据源
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();
}
试试看{
CloseableReference encodedImage=dataSource.getResult();
如果(imageReference!=null){
试一试{
//对编码后的图像执行一些操作,但不要保留对它的引用!
//一旦下面的引用关闭,图像可能会被回收。
}最后{
CloseableReference.CloseSafety(编码图像);
}
}否则{
//缓存未命中
...
}
}最后{
dataSource.close();
}
不要忘记关闭引用,以免内存泄漏。
你可以找到更多的信息。

我想这会对你有所帮助

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

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

你到底为什么要这样做?Fresco已经为您管理了所有的缓存等。@AlexanderOprisnik我能想到的一个很好的理由是,对于UI测试来说,访问位图可绘制是有用的,但要做到这一点,我们需要从一个常规的可绘制开始,我不知道如何进行转换,因为我想让用户看到一些图像,然后将其保存到存储器中