Fresco 保存gif文件及图片到本地
来源:互联网 发布:mac玩fifaonline3 编辑:程序博客网 时间:2024/05/16 06:00
注意:本文基于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 { //保存失败处理 } }
0 0
- Fresco 保存gif文件及图片到本地
- fresco 加载本地gif图片
- Qt 获取网络gif图片并保存到本地显示
- fresco+本地加载gif
- url图片 保存文件到本地
- 保存图片到本地
- 图片保存到本地
- 图片保存到本地
- 保存图片到本地
- 图片保存到本地
- fresco加载gif图片到99%卡住的bug
- 保存文件到本地
- iOS gif图片保存到相册里面
- 远程获取图片二进制流及保存到本地
- ASP保存远程图片文件到本地代码
- 使用URLConnection下载文件或图片并保存到本地
- 使用urlconnection下载文件或图片并保存到本地
- 使用urlconnection下载文件或图片并保存到本地
- 实验博客1:1.个人所得税及税后计算。2.多分段函数计算。
- Hadoop学习路线图
- CCF游戏----BFS和三维数组记忆化搜索
- JDBC链接MySql数据库基本操作
- 【LeetCode】Merge k Sorted Lists(java)
- Fresco 保存gif文件及图片到本地
- 计划与提醒
- 算法--打印素数--死记硬背也要牢记
- leetcode_middle_69_129. Sum Root to Leaf Numbers
- iOS 之自定义view
- 蓝桥杯第四届 排它平方数
- 字符串匹配的KMP算法
- 错误:Write operations are not allowed in read-only mode (FlushMode.MANUAL)
- JavaScript 运算对象Math