使用Picasso和OkHttp更新/更改缓存的位图

时间:2014-04-28 02:06:57

标签: android caching bitmap picasso okhttp

我目前正在使用Picasso和OkHttp进行位图缓存。我想要做的是检索一个特定的缓存位图,在其上绘制,然后将绘制在位图上的内容放回到内存和磁盘缓存中。我的实现非常标准,我只是使用Target并将加载的位图添加到驻留在GridView中的自定义ImageView。我一直在四处寻找,似乎无法找到办法。这些库甚至支持这样的东西吗?

2 个答案:

答案 0 :(得分:5)

Picasso只是用于下载缓存和显示图像的库(具有转换,交叉渐变等特权),不用于编辑。你似乎做的似乎超出了毕加索的使用范围。

我会说如果你愿意,你仍然可以使用Picasso下载图像,但是当你得到一个Bitmap时,你的应用程序就会存储它的修改版本。因此,当用户完成绘制时,您必须自己将其本地存储到文件中(如果它是一个大图像,您也可以为GridView创建单独的较小缩略图)并使用此版本。要将更改的位图内容保存到文件,您可以调用

outBitmap.compress(Bitmap.CompressFormat.PNG, 100, outStream);

您也可以使用Picasso将本地文件加载到GridView中:Picasso.with(context).load("fileUrl").into(mImageView);。因此,在您的代码中,您将检查是否具有本地编辑版本并使用Picasso从本地文件加载它,或者使用Picasso从服务器加载它。

如果要在服务器上保存图像,可以在用户编辑后将其发送到服务器。然后Picasso + OkHttp将再次下载它(假设你更新了像服务器上的ETag一样的http缓存属性)。

答案 1 :(得分:2)

尝试使用毕加索转换

毕加索的工作流程是这样的:

  1. 从网络获取图片
  2. 将原始图像缓存在内存/缓存中
  3. 应用可选转换并缓存这些结果
  4. 因此,在您的情况下,您需要进行改变位图的自定义转换。第二次使用此特定转换请求位图时,它将从缓存中加载。

    public class YourTransformation implements com.squareup.picasso.Transformation {
    
        @Override
        public Bitmap transform ( final Bitmap source ) {
            final Paint paint = new Paint();
    
            Bitmap output = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Config.ARGB_8888);
            Canvas canvas = new Canvas(output);
    
            // DO YOUR DRAWING STUFF ON CANVAS
    
            if (source != output) {
                source.recycle();
            }
    
            return output;
         }
    
         @Override
         public String key () {
             return "customTransformation" + SOME_UNIQUE_IDENTIFIER 
         }
    }
    

    不要忘记覆盖key()方法,因为毕加索使用它来生成缓存条目。

    在您的代码中,您只需将其与普通的毕加索请求一起使用即可:

    picasso.load(url).transform(new YourTransformation()).into(imageView);