如何将一堆png或webp图像转换为webp动画?
我尝试过:
convert mytiles.png -crop 100x100 +repage tmp.webp
但是我只得到了一堆webp图像,而不是动画。
另一种解决方案是使用gif2webp
,但是homebrew webp
软件包不包含此命令,这与官方documentation中的内容不同。
答案 0 :(得分:3)
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
是帧的持续时间,以毫秒为单位。Xi
,Yi
)是画布中框架的空间偏移量(从左上角开始计数,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混合,并且不丢弃之后)。