使用 Picasso 保存来自 URL 的图像而不改变大小(使用 bitmap.compress() 改变大小)

Saving image from URL using Picasso without change in size (using bitmap.compress() changes size)

我正在使用 Picasso 进行图像处理,并使用它从后端服务器下载图像并保存到本地设备。我用Target保存图片

            Picasso.with(context)
                .load(url)
                .into(target);

由于目标代码获取位图,我必须使用 bitmap.compress() 将图像写入本地磁盘并且我使用质量为 100 的 JPEF 格式假设这将保留原始质量。

阅读this 看来这可能不是我想要的。在一个案例中,后端的图像是 90kb,而写入的图像是 370kb。可以使用任意质量值生成原始图像。在不更改 size/quality 的情况下使用 Picasso 保存图像的最简单方法是什么?

     Target target = new Target() {
            @Override
            public void onPrepareLoad(Drawable arg0) {
            }

            @Override
            public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom arg1) {

                new AsyncTask<Void, Void, Void>() {
                    @Override
                    protected Void doInBackground(Void... params) {

                        FileOutputStream out = null;
                        try {
                            out = new FileOutputStream(imagePath);
                            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
                            out.close();
                        } catch (FileNotFoundException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }                            
                    }

                    @Override
                    protected void onPostExecute(Void info) {
                    }
                }.execute();
            }

            @Override
            public void onBitmapFailed(Drawable arg0) {
            }
        };

更新:这里有更优雅的解决方案:https://github.com/square/picasso/issues/1025#issuecomment-102661647

使用此解决方案解决了问题。

在我的 PagerAdapterinstantiateItem() 方法中,我 运行 一个 AsyncTask 将下载图像,将其保存到文件中,然后用它调用 Picasso图像文件。

PagerAdapter instantiateItem():

        RemoteImageToImageViewAsyncTask remoteImageToImageViewAsyncTask =
                new RemoteImageToImageViewAsyncTask(imageView, url, imagePath);
        remoteImageToImageViewAsyncTask.execute();

RemoteImageToImageViewAsyncTask

public class RemoteImageToImageViewAsyncTask extends AsyncTask<Void, Void, Void> {
    ImageView imageView;
    String url;
    File output;

    public RemoteImageToImageViewAsyncTask(ImageView imageView, String url, File output) {
        this.imageView = imageView;
        this.url = url;
        this.output = output;
    }

    @Override
    protected Void doInBackground(Void... params) {
        // Downloads the image from url to output
        ImageDownloader.download(url, output);
        return null;
    }

    @Override
    protected void onPostExecute(Void params) {
        Picasso.with(context)
                   .load(output)
                   .into(imageView);
    }
}