重新取样动画的HTMLImageElement

时间:2018-03-14 13:11:50

标签: html5-canvas webgl

可以重新采样HTMLVideoElement,以便随时间将不同的帧添加到纹理中。

例如,如https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Tutorial/Animating_textures_in_WebGL

所示

然而,当将动画gif加载到HTMLImageElement时,重新采样不会显示更新的纹理。即使图像安装在dom上并且不同的帧显示在该副本上也是如此。

是否有标准方法在webgl中显示动画gif,或者必须在运行时以某种方式将其重写为spritesheet(或一系列纹理)?

1 个答案:

答案 0 :(得分:0)

GIF不会使用WebGL(或常规画布)自动设置动画,并且没有标准的方法来执行此操作。

与视频元素相反,GIF图像仅通过touchstart绘制第一个帧,而绘制视频元素将绘制当前帧。这部分是因为我们实际上无法通过API访问任何图像的帧(这也适用于动画PNG文件,即APNG),动画图像将仅作为由浏览器自行决定的内部过程处理并且只有在DOM中。

使用视频元素虽然我们可以访问“框架”,也就是通过drawImage()的时间,所以它意味着我们想要处理我们在当前时间看到或存在的内容。

您必须手动为GIF图像设置动画。这意味着您必须首先将每个帧提取为单独的图像/缓冲区,然后以您选择的速率显示它们。浏览器在这里没有帮助,但您可以通过手动解析文件格式来完成此操作。

当然,这可能有点单调乏味,但幸运的是,那里的人已经完成了所有的提升和努力工作。例如gifuct(我自己没有测试过,但也有其他测试)允许你从GIF中提取每一帧

然后将从中获得的每个帧渲染到帧缓冲区中,并以您选择的帧速率上传到GPU。

或者:

  • 在您提及
  • 时将GIF预处理为spritesheet
  • 或将其作为图像序列加载
  • 或将GIF转换为视频(这甚至可能会减少总尺寸)

作为一个无耻的插件,如果你应该考虑APNG:我已经apng-parser为APNG文件做了同样的事情。

我的建议虽然是将GIF / APNG转换为视频文件,该视频文件为免费的,可能更小的文件提供动画功能,可以缓存和流式传输以获得长动画,减少要包含的代码和通常是单个文件来处理(您可能必须为旧版浏览器提供不同的视频格式)。 FFMpeg等免费软件可以帮助您进行转换。