Fresco 保存gif文件及图片到本地

注意:本文基于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 {
            //保存失败处理
        }
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值