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
原创粉丝点击