注意:本文基于frescolib-v0.12.0
转载务必注明出处:/u014614038/article/details/60597264
保存图片方法
1.最简单的方法,订阅BaseBitmapDataSubscriber获取图片bitmap:
保存图片的方法很简单,通过订阅数据源就可以返回当前图片的bitmap,然后对保存bitmap就可以了:
private void SaveImageFromDataSource(String url, final String localSavePath) {
ImageRequest imageRequest = ((url))
.setProgressiveRenderingEnabled(true).build();
DataSource<CloseableReference<CloseableImage>> dataSource = ()
.fetchDecodedImage(imageRequest, ImagesPlayAcTivity.this);
(new BaseBitmapDataSubscriber() {
@Override
public void onNewResultImpl(@Nullable Bitmap bitmap) {
if (bitmap != null) {
Boolean savesucess = saveBitmap(bitmap, localSavePath);
if (savesucess) {
//保存成功处理
} else {
//保存失败处理
}
} else {
//保存失败处理
}
}
@Override
public void onFailureImpl(DataSource dataSource) {
//保存失败处理
}
}, ());
}
保存bitmap到本地的方法:
public Boolean saveBitmap(Bitmap bitmap, String localSavePath) {
if ((localSavePath)) {
throw new NullPointerException("保存的路径不能为空");
}
File f = new File(localSavePath);
if (()) {// 如果本来存在的话,删除
();
}
try {
();
} catch (IOException e) {
();
}
try {
FileOutputStream out = new FileOutputStream(f);
(, 100, out);
out.flush();
out.close();
} catch (FileNotFoundException e) {
();
return false;
} catch (IOException e) {
();
return false;
}
return true;
}
2.比较好拓展的方法,订阅BaseDataSubscriber获取通用数据源
private void SaveImageFromDataSource(String url, final String localSavePath) {
ImageRequest imageRequest = ((url))
.setProgressiveRenderingEnabled(true).build();
DataSource<CloseableReference<CloseableImage>> dataSource = ()
.fetchDecodedImage(imageRequest, ImagesPlayAcTivity.this);
(new BaseDataSubscriber<CloseableReference<CloseableImage>>() {
@Override
protected void onFailureImpl(DataSource<CloseableReference<CloseableImage>> source) {
}
@Override
protected void onNewResultImpl(DataSource<CloseableReference<CloseableImage>> source) {
CloseableReference<CloseableImage> reference = ();
CloseableImage image = ();
if(image instanceof CloseableBitmap){
CloseableBitmap bitmapimage = (CloseableBitmap) image;//图片转为bitmap
Bitmap picbitmap = ();
saveBitmap(picbitmap, localSavePath);
}
}
}, ());
}
2.保存gif的方法
上面是比较比较推荐的保存图片的方法,然而对应gif来说,有点麻烦,我找了很久并没有找到比较好的方法,BaseDataSubscriber可以获取到gif的每桢的bitmap数据信息,试了好像也不能保存,返回null。
private void SaveImageFromDataSource(String url, final String localSavePath) {
ImageRequest imageRequest = ((url))
.setProgressiveRenderingEnabled(true).build();
DataSource<CloseableReference<CloseableImage>> dataSource = ()
.fetchDecodedImage(imageRequest, ImagesPlayAcTivity.this);
(new BaseDataSubscriber<CloseableReference<CloseableImage>>() {
@Override
protected void onFailureImpl(DataSource<CloseableReference<CloseableImage>> source) {
}
@Override
protected void onNewResultImpl(DataSource<CloseableReference<CloseableImage>> source) {
CloseableReference<CloseableImage> reference = ();
CloseableImage image = ();
if (image instanceof CloseableAnimatedImage) {// 如果是有动画的image,就是gif
CloseableAnimatedImage bitmapimage = (CloseableAnimatedImage) image;// 图片转为bitmap
CloseableReference<Bitmap> picbitmap = ().getPreviewBitmap();//获取到bitmap,可是这个bitmap返回的是null
Boolean sucess = saveBitmap((), localSavePath);//() 返回null
}
}
}, ());
}
gif与图片可以通过获取本地缓存文件的方法保存到自己想要的目录下,方法如下。
private void SaveGifFromMainFileCache(String url, String localSavePath) {
ImageRequest imageRequest = ((url))
.setProgressiveRenderingEnabled(true).build();
CacheKey cacheKey = ().getEncodedCacheKey(imageRequest,
ImagesPlayAcTivity.this);
if (().getMainFileCache().hasKey(cacheKey)) {
BinaryResource resource = ().getMainFileCache().getResource(cacheKey);
File cacheFile = ((FileBinaryResource) resource).getFile();
ImageFormat imageFormat = null;
try {
imageFormat = (new FileInputStream(cacheFile));
switch (imageFormat) {
case GIF:
Boolean savesucess = (cacheFile, localSavePath);//把缓存文件复制到要保存的位置上
if (savesucess) {
//保存成功处理
} else {
//保存失败处理
}
break;
default:
break;
}
} catch (IOException e) {
//保存失败处理
();
}
} else {
//保存失败处理
}
}