Glide:如何使用Glide v4调整大小并将gif保存为文件?

3

我希望调整gif文件的大小并保存它。我尝试使用一些建议的方法,但是那些方法会产生错误,后来我了解到在Glide v4中,有些方法已经被弃用。

           byte[] bytes = Glide.with(context)
                         .asGif()                   
                         .load(url)
                         .toBytes()
                         .into(250, 250)
                         .submit()
                         .get();

在上述代码中,将数组转换为文件后得到了一个大小为4.x MB的空白 gif 文件。
            File file = Glide.with(reactContext)
                        .asFile()
                        .load(url)
                        .override(512, 512)
                        .fitCenter()
                        .into(512,512)
                        .get();

并且

            File file = Glide.with(reactContext)
                        .asFile()
                        .load(url)
                        .apply(new RequestOptions().override(512, 512))
                        // .diskCacheStrategy(DiskCacheStrategy.ALL)
                        .submit(512,512)
                        .get();

并且

            File file = Glide.with(reactContext)
                        .asFile()
                        .load(url)
                        // .override(512, 512)
                        .fitCenter()
                        .submit(512,512)
                        .get();

但上面的代码保持了宽度和高度不变。

详情:

Glide version : 4.13.0

请分享适当的代码或建议调整GIF大小(以文件形式保存而非显示)。

你使用的是哪个Glide版本? - Sambhav Khandelwal
2
你是否已经添加了这两个库?如果没有,请添加它们。implementation 'com.github.bumptech.glide:glide:4.13.0'annotationProcessor 'com.github.bumptech.glide:compiler:4.13.0' - Sambhav Khandelwal
1
asGif现在可以工作,但无法保存为文件。文件大小为4MB,但文件是空白的。 - CrackerKSR
我在 Glide 的仓库中看到了 asFile 类型,因此我尝试使用 asFile()。但是我无法使用 override(size) 和 submit(size) 调整 gif 的大小。 - CrackerKSR
如果您对 Glide 很熟悉,能否告诉我如何调整 gif 文件的大小以便保存而不是在 ImageView 上显示? - CrackerKSR
正如我的问题标题所示,我想要调整大小并保存gif :) - CrackerKSR
1个回答

2

Glide 不仅可以加载文件,还可以下载它们。这正是你想要的。你只需使用此代码即可下载。

Glide.with(MainActivity.this).asFile()
            .load(url)
            .apply(new RequestOptions()
                    .format(DecodeFormat.PREFER_ARGB_8888)
                    .override(Target.SIZE_ORIGINAL)) // you can also give your size here
            .into(new Target<File>() {
                @Override
                public void onStart() {

                }

                @Override
                public void onStop() {

                }

                @Override
                public void onDestroy() {

                }

                @Override
                public void onLoadStarted(@Nullable Drawable placeholder) {

                }

                @Override
                public void onLoadFailed(@Nullable Drawable errorDrawable) {

                }

                @Override
                public void onResourceReady(@NonNull File resource, @Nullable Transition<? super File> transition) {
                    storeImage(resource);
                }

                @Override
                public void onLoadCleared(@Nullable Drawable placeholder) {

                }

                @Override
                public void getSize(@NonNull SizeReadyCallback cb) {

                }

                @Override
                public void removeCallback(@NonNull SizeReadyCallback cb) {

                }

                @Override
                public void setRequest(@Nullable Request request) {

                }

                @Nullable
                @Override
                public Request getRequest() {
                    return null;
                }
            });

storeImage 方法:

private void storeImage(File image) {
    File pictureFile = getOutputMediaFile();
    if (pictureFile == null) {
        return;
    }
    try {
        FileOutputStream output = new FileOutputStream(pictureFile);
        FileInputStream input = new FileInputStream(image);

        FileChannel inputChannel = input.getChannel();
        FileChannel outputChannel = output.getChannel();

        inputChannel.transferTo(0, inputChannel.size(), outputChannel);
        output.close();
        input.close();
        Toast.makeText(MainActivity.this, "Image Downloaded", Toast.LENGTH_SHORT).show();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private File getOutputMediaFile() {
    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/Diwali Images"); // change the folder name according to your needs.
    if (!mediaStorageDir.exists()) {
        if (!mediaStorageDir.mkdirs())
            return null;
    }

    File mediaFile;
    mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_SHUBH_DIWALI_"+Calendar.getInstance().getTimeInMillis() +".gif"); // change the name of the file according to your wish
    return mediaFile;
}

编辑


我已经找到了一个相关的库。在这个库中,我发现这个类非常有趣。在这里,我们可以在构造函数中传递宽度和高度,然后保存它。


1
非常感谢您的努力。代码正在创建GIF文件,但大小仍然与原始大小相同。我尝试了override(512,512)和override(512)。 - CrackerKSR
我在 Glide 存储库上阅读了一些关于问题的讨论。有一个 Gifencoder 类。看起来我们需要它来操作 gif。嗯,我不太确定。 - CrackerKSR
这里有一段代码片段,但是在Glide v4中没有GifResourceEncoder这个类 https://github.com/bumptech/glide/issues/1570#issuecomment-258636999 ,不过我在这里找到了一个类似的类(ReEncodingGifResourceEncoder)https://github.com/bumptech/glide/blob/d2bb3e8a6a2296b20ecaeb7759c16ef15aacbb28/integration/gifencoder/src/main/java/com/bumptech/glide/integration/gifencoder/ReEncodingGifResourceEncoder.java - CrackerKSR
1
嗨@CrackerKSR。我可能回答晚了,但我已经发现了一件事情,因此已经编辑了答案。 - Sambhav Khandelwal
我的代码有什么问题导致它不能被接受吗?我一定会尝试修复它。 - Sambhav Khandelwal
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接