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

时间:2025-01-31 08:09:14

注意:本文基于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 {
            //保存失败处理
        }
    }