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