使用Picasso从URL保存图像而不改变大小(使用bitmap.compress()更改大小)

时间:2015-05-16 15:39:32

标签: android image-processing picasso

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

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

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

阅读this似乎这可能不是我想要的。在一种情况下,后端的图像为90kb,写入的图像为370kb。可以使用任意质量值生成原始图像。在没有尺寸/质量变化的情况下使用毕加索保存图像的最简单方法是什么?

     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) {
            }
        };

1 个答案:

答案 0 :(得分:-2)

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

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

在我的PagerAdapter的{​​{1}}方法中,我运行instantiateItem()将下载图像,将其保存到文件中,然后使用该图像文件调用Picasso。

PagerAdapter instantiateItem():

AsyncTask

RemoteImageToImageViewAsyncTask

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