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

Posted

技术标签:

【中文标题】使用 Picasso 和 OkHttp 更新/更改缓存位图【英文标题】:Update/change cached bitmap using Picasso and OkHttp 【发布时间】:2014-06-13 10:19:07 【问题描述】:

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

【问题讨论】:

【参考方案1】:

Picasso 只是用于下载缓存和显示图像(具有转换、交叉淡入淡出等功能)的库,而不是用于编辑的库。你所做的似乎超出了毕加索的使用范围。

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

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

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

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

【讨论】:

所以你是说将编辑的位图保存在 OkHttp/Picasso 使用的磁盘缓存之外的其他地方。然后只需检查该位置的位图是否已更新。如果是从备用本地文件加载它? 我会做这样的事情是的。【参考方案2】:

尝试使用毕加索变换

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

    从网络获取图片 在内存/缓存中缓存原始图像 应用可选转换并缓存这些结果

因此,在您的情况下,您需要进行自定义转换来改变您的位图。第二次请求具有此特定转换的位图时,将从缓存中加载。

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 使用它来生成缓存条目。

在您的代码中,您可以简单地将其与正常的毕加索请求一起使用:

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

【讨论】:

用户将是其上的一个绘图者,他们可能会多次在其上绘图。所以我不知道它会被如何绘制。

以上是关于使用 Picasso 和 OkHttp 更新/更改缓存位图的主要内容,如果未能解决你的问题,请参考以下文章

使用 Retrofit、okhttp 和 picasso 缓存图像和字符串

Picasso:设置旧版本的 OkHttp3

OkHttp框架从入门到放弃,解析图片使用Picasso裁剪,二次封装OkHttpUtils,Post提交表单数据

如何更改 Okhttp 中的默认缓存策略?

Android_OkHttp+Picasso+RecyclerView实现网络图片下载瀑布流

Android_OkHttp+Picasso+RecyclerView实现网络图片下载瀑布流