将一堆PNG或WebP图像转换为WebP动画

时间:2019-10-14 09:49:19

标签: imagemagick homebrew

如何将一堆png或webp图像转换为webp动画?

我尝试过:

convert mytiles.png -crop 100x100 +repage tmp.webp

但是我只得到了一堆webp图像,而不是动画。

另一种解决方案是使用gif2webp,但是homebrew webp软件包不包含此命令,这与官方documentation中的内容不同。

1 个答案:

答案 0 :(得分:3)

将帧转换为WebP,然后使用webpmux

webpmux程序随附Google的WebP参考库,即libwebp,如果尚不存在,则可以通过软件包管理器进行安装。其man page读为:

webpmux —从非动画WebP图像创建动画WebP文件,从动画WebP图像提取帧,以及管理XMP / EXIF元数据和ICC配置文件。

如果您的各个框架使用其他格式,则首先需要将其转换为WebP。对于此任务,您可以使用ImageMagick(更多选项here-除非需要,请确保禁用lossy compression

convert frame001.png -define webp:lossless=true frame001.webp

然后,您可以使用webpmux合并帧。语法如下,其中大写单词是占位符:

webpmux \
  -frame frame001.webp +D1+X1+Y1+M1±b \
  -frame frame002.webp +D2+X2+Y2+M2±b \
  -frame frame003.webp +D3+X3+Y3+M3±b \
  [-loop L]  [-bgcolor A,R,G,B] \
  -o animation.webp

每个帧需要许多设置。除了持续时间,所有这些都可以保留。

  • Di是帧的持续时间,以毫秒为单位。
  • ({XiYi)是画布中框架的空间偏移量(从左上角开始计数,X朝右,Y朝下)。
  • Mi是此帧的 dispose方法,换句话说,一旦此帧过期,该怎么办。它有两个可能的值:
    • 0:请勿处理,将画布保持原样;
    • 1:丢弃,清理画布,并用背景填充(为此消耗能量)。
  • ±b是此框架的混合方法,它指定如何将该框架叠加在现有画布的顶部(仅当该框架具有alpha通道时才相关,否则仍然会覆盖其下方的内容)。此参数有两个可能的值:
    • -b:请勿融合,框架会覆盖现有画布;
    • +b:使用Alpha混合,框架与现有画布结合。

然后是应用于整个动画的可选设置:

  • -loop L指定播放动画的次数L。您可能希望它是无限的,即-loop 0,这是默认值。
  • -bgcolor A,R,G,B指定背景色。四个分量(alpha,红色,绿色,蓝色)的值范围从0到255。查看者可以使用此颜色作为画布的背景,因此画布是不透明的,但是它们是不是必需;实际上,画布是覆盖在其他元素之上的,例如在网页中,我还没有看到使用这种颜色。

另请参阅WebP specification about animations

最后的提示:由于每帧的命令行选项不仅仅是输入文件名,因此您不能直接使用通配符,例如frame*.webp,并且编写命令行非常麻烦。值得庆幸的是,您可以使用Shell来使用Bash构建命令行例如

frames=( )
for f in frame*.webp ; do
    frames+=( -frame "$f" +100+0+0+0+b )
done
webpmux "${frames[@]}" -o animation.webp

上面的示例创建了一个动画,该动画的帧都是与frame*.webp匹配的所有图像,持续时间为100ms,没有空间偏移,并且与先前的帧结合在一起(对新的帧使用alpha混合,并且不丢弃之后)。