问题标签 [animated-webp]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
4866 浏览

android - 使用 Glide,我怎样才能将 GifDrawable 的每一帧作为位图遍历?

背景

在动态壁纸中,我有一个 Canvas 实例,我希望将 GIF/WEBP 内容绘制到该实例中,该实例是通过 Glide 加载的。

我希望用 Glide 来做这件事的原因是,它比我过去为同样的事情找到的解决方案提供了一些优势(这里,存储库这里):

  1. 电影的使用使我只能使用 GIF。使用 Glide 我还可以支持 WEBP 动画
  2. 电影的使用似乎效率低下,因为它没有告诉我在帧之间等待的时间,所以我必须选择我希望尝试使用的 FPS。它在 Android P 上也已弃用。
  3. Glide 或许能够简化各种缩放的处理。
  4. Glide 可能不会像原始代码那样崩溃,并且可能提供更好的机制控制。

问题

Glide 似乎被优化为仅适用于普通 UI(视图)。它有一些基本功能,但我正在尝试做的最重要的功能似乎是私有的。

我发现了什么

我使用官方Glide 库(v 3.8.0)进行 GIF 加载,使用 GlideWebpDecoder进行 WEBP 加载(具有相同版本)。

加载每一个的基本调用如下:

动图:

网页版:

现在,请记住我并没有真正的 ImageView,而是我只有一个 Canvas,我通过surfaceHolder.lockCanvas()电话获得。

但是,当我尝试获取要用于当前帧的位图时,我找不到正确的函数。

例如,我尝试了这个(这只是一个例子,看看它是否可以与画布一起使用):

但它似乎并没有将内容绘制到位图中,我认为是因为它的draw函数有这几行代码:

然而getDestRect()返回一个 0 大小的矩形,我找不到如何修改它:它也是私有的,我看不到任何改变它的东西。

问题

  1. 假设我得到了我想要使用的 Drawable (GIF/WEBP),我怎样才能得到它可以产生的每一帧(而不仅仅是第一帧),并将它绘制到画布中(帧之间的时间量合适, 当然) ?

  2. 我也可以以某种方式设置缩放类型,就像在 ImageView (center-crop, fit-center, center-inside ...) 上一样?

  3. 有没有更好的选择呢?也许假设我有一个 GIF/WEBP 动画文件,Glide 是否允许我只使用它的解码器?像这个图书馆的东西?


编辑:

我找到了一个不错的替代库,它允许一帧接一帧地加载 GIF,here。逐帧加载似乎效率不高,但它是开源的,可以轻松修改以更好地工作。

在 Glide 上做这件事可能会更好,因为它也支持缩放和 WEBP 加载。

我制作了一个 POC(此处链接),它表明它确实可以逐帧运行,等待它们之间的正确时间。如果有人成功地完成了与我完全相同的操作,但在 Glide(当然是最新版本的 Glide)上,我将接受答案并授予赏金。这是代码:

**GifPlayer.kt,基于 NsGifPlayer.java **

MainActivity.kt

0 投票
4 回答
4885 浏览

android - 是否可以手动让新的 ImageDecoder 类一帧一帧地返回位图?

背景

我正在尝试手动(逐帧)检查动画 GIF 和 WEBP 文件的位图,以便它不仅适用于视图,而且适用于其他情况(例如动态壁纸)。

问题

仅 Android P 支持动画 GIF/WEBP 文件,使用 ImageDecoder API(此处为示例)。

对于 GIF,我想尝试 Glide 来完成这项任务,但我失败了,所以我尝试通过使用允许加载它们的库来克服这个问题(这里,解决方案这里)。我认为它工作正常。

对于 WebP,我想我找到了另一个可以在旧 Android 版本上运行的库(在这里,在这里做了 fork ),但它似乎在某些情况下不能很好地处理 WebP 文件(在这里报告)。我试图找出问题所在以及如何解决它,但我没有成功。

所以,假设有一天谷歌会通过支持库(他们写在这里)支持旧 Android 版本的 GIF 和 WEBP 动画,我决定尝试使用 ImageDecoder 来完成这项任务。

问题是,查看 ImageDecoder 的整个 API,我们应该如何使用它是非常有限的。我不知道如何克服它的限制。

我发现了什么

这就是 ImageDecoder 可用于在 ImageView 上显示动画 WebP 的方式(当然,这里只是一个示例):

我试图阅读ImageDecoderAnimatedImageDrawable的所有文档,并查看它的代码,但我不明白如何手动检查每一帧,并有时间在它们之间等待。

问题

  1. 有没有办法使用 ImageDecoder API 手动检查每一帧,获取要绘制的位图并知道在帧之间需要等待多长时间?有什么可用的解决方法吗?也许甚至使用 AnimatedImageDrawable ?

  2. 我想在旧的 Android 版本上做同样的事情。可能吗?如果有怎么办?也许在不同的 API/库上?谷歌写道,它可以在较旧的 Android 版本上使用 ImageDecoder,但我没有看到任何地方提到它(除了我提供的链接)。可能还没有准备好……Android P 甚至还没有达到 0.1% 的用户……也许Fresco可以做到?我也试过在那里检查它,但我也没有看到它能够做这样的事情,而且它是一个巨大的库,仅用于这项任务,所以我宁愿使用不同的库来代替.. . 我也知道 libwebp 是可用的,但它是 C/C++ 的,不确定它是否适合 Android,以及在 Java/Kotlin for Android 上是否有它的端口。


编辑:

因为我认为我得到了我想要的,对于第三方库和 ImageDecoder,能够从动画 WebP 中获取位图,我仍然想知道如何使用 ImageDecoder 获取帧数和当前帧,如果这是可能的。我尝试使用ImageDecoder.decodeDrawable(source, object : ImageDecoder.OnHeaderDecodedListener...,但它不提供帧计数信息,并且我无法在 API 中看到我可以转到特定的帧索引并从那里开始,或者知道特定帧的时间有多长需要进入下一帧。所以我对这里的那些人做了一个reuqest 。

可悲的是,我也找不到 Google 有适用于旧 Android 版本的 ImageDecoder。

如果有某种方法可以像我对相对较新的 HEIC 动画文件所做的那样做同样的事情,这也很有趣。目前它仅在 Android P 上受支持。

0 投票
1 回答
156 浏览

android - Fresco - 如何检查文件是否以编程方式为 webP 动画?

我有一个 webP 格式的图像文件。如何以编程方式检查它是动画 webP 还是静态图像?

0 投票
1 回答
670 浏览

ffmpeg - 动画 Webp - 改变帧率

是否有任何工具或脚本可以批量转换动画 webp 图像?

我想从我的动画 webp 图像创建动画缩略图:

  • 调整图像大小
  • 降低质量(有损压缩)
  • 降低帧率

我尝试了ImageMagick之类的工具,但它们无法更改帧速率。

0 投票
2 回答
24 浏览

android - Dart:参数类型“图像?” 不能分配给参数类型“图像”

这个错误是什么意思以及如何解决?

错误:

飞镖代码:

有哪些修复方法?

0 投票
0 回答
26 浏览

android - 需要压缩(减小大小)动画 WEBP 文件 - FFmpeg、libwebp

我想减小 WEBP 文件的大小。我正在使用https://github.com/tanersener/ffmpeg-kit库将我的视频 .mp4 转换为 .webp
输入文件 MP4 大小 - 800kb
输出文件 WEBP 大小 - 5.22 MB

我使用的命令

ffmpeg.exe -i outputbitrate.mp4 -vcodec libwebp -filter:v fps=fps=20 -lossless 1 -loop 0 -preset default -an -vsync 0 -vf scale=512:512:force_original_aspect_ratio=decrease,format=rgba, pad=512:512:-1:-1:color=#00000000 finalout.webp

我也尝试了 compress_level,质量。这并没有减少输出大小。
在我的情况下,输出应该小于 512kb。如何实现这一点。

任何文章或示例代码都会非常有帮助。谢谢

0 投票
0 回答
17 浏览

java - 如何在 Android 中操作 GIF / Animated WebP 图像文件

我想在 android 中调整和转换 gif 和动画 webp 文件,如下所示

输入:Gif / 动画 WebP 图像文件。(将由用户从手机的图库中挑选)

输出:动画 WebP 文件(1)缩放 512x512,2)相应地填充透明区域以保持原始图像的比例)

提前致谢。如果您能提出您的建议,那就太好了