java - Glide - 将 GIF 保存到文件

标签 java android kotlin gif android-glide

旁注 - 尽管我的一些示例是使用 Kotlin 编写的,但使用 Java 或 Kotlin 编写的答案很有帮助。

我正在使用 Commit Content API 创建一个 GIF 键盘.为此,我需要能够创建 .gif 文件。

我正在使用 Glide 从互联网上获取图像并将它们显示在 recyclerview 内的列表中。

对于 Glide 下载的每张图片,我必须使用该图片的数据创建一个 File 对象。

我看到有两种方法可以实现这个目标。

1] 像这样创建一个覆盖 onResourceReady 的监听器。这种方法的问题是我不知道如何将 GifDrawable 转换为 .gif 文件,因为所有 Stack Overflow 帖子都在谈论如何转换 >Drawable 到文件:

    Glide.with(context)
            .asGif()
            .load(items[position])
            .listener(object : RequestListener<GifDrawable> {
                override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<GifDrawable>?, isFirstResource: Boolean): Boolean {
                    Log.d("VED-APP","Glide Load Failed")
                    return false
                }

                override fun onResourceReady(resource: GifDrawable?, model: Any?, target: Target<GifDrawable>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
                    //I need code to convert the GifDrawable to a File

                    return false
                }

            })
            .into(holder.imageView)

2] 将图像加载到 ByteArray 或类似的东西。示例 Java 代码,取自帖子 Glide - download and resize GIF into a file , 可能看起来像这样。这段代码的问题在于

A] .into(width,height) 已弃用

B] 没有.toBytes 方法

C] 我不想指定我的 GIF 的尺寸 - 我只想使用原始尺寸。 (或者,至少,我想保留纵横比)

byte[] bytes = Glide.with(context)
                    .load(items[position])
                    .asGif()
                    .toBytes()
                    .into(250, 250)
                    .get();
file = new File(fileName);

FileOutputStream fileWriter = new FileOutputStream(file);
fileWriter.write(bytes);
fileWriter.flush();
fileWriter.close();

有人可以帮助我改进这两种方法中的任何一种,或者建议一种使用 Glide 将 GIF 转换为文件的新方法吗?

最佳答案

如果您只需要内容提交 API 的 URI,更新 @Nhật Tôn 的解决方案可能更好。

我不知道@Nhật Tôn 的解决方案是否有效。但是,这是我现在使用的解决方案,它基于他们的解决方案。我的解决方案是在 Kotlin 中,但它可以很容易地转换为 Java。

首先,我使用以下代码将图像加载到 ImageView 中:

//items[position] is a string that represents a URL
Glide.with(context)
        .load(items[position])
        .into(holder.imageView)

然后我从 ImageView 获取 GifDrawable 并将其写入 File 对象。

val byteBuffer = (holder.imageView.drawable as GifDrawable).buffer
val gifFile = File(localDirectory, "test.gif")

val output = FileOutputStream(gifFile)
val bytes = ByteArray(byteBuffer.capacity())
(byteBuffer.duplicate().clear() as ByteBuffer).get(bytes)
output.write(bytes, 0 ,bytes.size)
output.close()

此解决方案的一个潜在问题是 GifDrawable 在写入文件时可能会被修改。

解决此问题的方法是在将其写入文件之前像这样克隆 GifDrawable:

val newGifDrawable = ((holder.imageView.drawable).constantState.newDrawable().mutate()) as GifDrawable

关于java - Glide - 将 GIF 保存到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50663369/

相关文章:

java - 如何抛出 ArrayIndexOutOfBoundsException?

java - 为什么我的网格没有从 'O' 更新到 'S'(数组)

android - getApplication() 和跨越给定应用程序中的 Activity

android-studio - 如何在 RecyclerView 上使用 LiveData?

Android Studio - Kotlin 项目的 "Unsolved reference"问题

java - 如何在 Kotlin 中传递有界通配符类型参数?

java - Spring Boot 应用程序中的 MySQL 数据库中没有创建表

java - 如何使用 OkHttp - Android 将 html 源代码获取到字符串

java - 如何从android向servlet发送带有参数的请求

java - Android依赖问题