使用 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
使用此解决方案解决了问题。
在我的 PagerAdapter
的 instantiateItem()
方法中,我 运行 一个 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);
}
}
我正在使用 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
使用此解决方案解决了问题。
在我的 PagerAdapter
的 instantiateItem()
方法中,我 运行 一个 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);
}
}