Imagemagick如何在多张图片之间进行转换-需要思路建议。

3

我正在使用Fred的Imagemagick脚本,特别是fxtransitions来创建两张图片之间的转场效果。我正在创建jpeg图像帧。稍后,我将使用ffmpeg将它们转换为视频。这是我使用Imagemagick的第三天,目前我可以成功地使用以下脚本在两张图片之间应用转场效果。但是,我还需要满足以下两个条件:

$result = shell_exec("bash /cygdrive/path/to/fxtransitions -e  explode -f 50 -d 1 -p 1 -r first.jpg second.jpg output.jpg"); 
echo $result;
  1. 每张图片必须保持9秒钟并且没有失真,然后快速切换到下一张图片。

  2. 目前,Fred的脚本只能容纳两个图片输入。是否可以在脚本中使用多于两个图片?如何使用PHP循环遍历多个图片?

1个回答

9

不确定你在3天内使用ImageMagick获取了什么信息 - 它是一款功能强大的软件,你可以花一生时间来学习。无论如何,让我们制作一些动画,看看我的唠叨是否能帮助到你。

首先,我们制作红色、绿色和蓝色的图像来进行操作:

convert -size 100x100 xc:red    r.png
convert -size 100x100 xc:green  g.png
convert -size 100x100 xc:blue   b.png

接下来,我们从红色融合到绿色,使用8个中间步骤,共计10张图片,并将它们合成一个动画系列,在帧之间设置20毫秒的延迟,并称其为r2g.gif(表示从红到绿):

convert -delay 20 r.png g.png -morph 8 r2g.gif   # Make 10 frame morph called "r2g.gif"

identify r2g.gif                                 # look at frames
r2g.gif[0] GIF 100x100 100x100+0+0 8-bit sRGB 2c 1.74KB 0.000u 0:00.000
r2g.gif[1] GIF 100x100 100x100+0+0 8-bit sRGB 2c 1.74KB 0.000u 0:00.000
r2g.gif[2] GIF 100x100 100x100+0+0 8-bit sRGB 2c 1.74KB 0.000u 0:00.000
r2g.gif[3] GIF 100x100 100x100+0+0 8-bit sRGB 2c 1.74KB 0.000u 0:00.000
r2g.gif[4] GIF 100x100 100x100+0+0 8-bit sRGB 2c 1.74KB 0.000u 0:00.000
r2g.gif[5] GIF 100x100 100x100+0+0 8-bit sRGB 2c 1.74KB 0.000u 0:00.000
r2g.gif[6] GIF 100x100 100x100+0+0 8-bit sRGB 2c 1.74KB 0.000u 0:00.000
r2g.gif[7] GIF 100x100 100x100+0+0 8-bit sRGB 2c 1.74KB 0.000u 0:00.000
r2g.gif[8] GIF 100x100 100x100+0+0 8-bit sRGB 2c 1.74KB 0.000u 0:00.000
r2g.gif[9] GIF 100x100 100x100+0+0 8-bit sRGB 2c 1.74KB 0.000u 0:00.000

我们可以用同样的方法将绿色变为蓝色。
convert -delay 20 g.png b.png -morph 8 g2b.gif

这给我们带来了以下两个GIF图像:

enter image description here

enter image description here

思路1

首先,我想告诉您的是,您可以使用ImageMagick将动态GIF图像连接在一起,如下所示:

convert r2g.gif g2b.gif both.gif

让你先从红色到绿色,然后再从绿色到蓝色。

enter image description here

重要的是,如果你使用Fred的脚本,你可以将动画A连接到动画B。因此,只要你能在2个点之间进行动画(你可以),你就可以通过连接两个动画来动画到第三个点,因此不需要向Fred的脚本传递超过2个点。

思路2

-delay参数是一个设置而不是一个操作,因此它会保留到命令结束或者直到你改变它。所以你可以使一帧的帧延迟时间很长,然后在随后的帧中恢复到较短的时间,如下:

convert -delay 300 r2g.gif[0]    \
        -delay 20 r2g.gif        \
        -delay 300 g2b.gif[0]    \
        -delay 20 g2b.gif        \
        staccato.gif

enter image description here

本质上,我们在动画的第一帧暂停了3秒,并将红绿和绿蓝动画之间的过渡帧也保持在3秒钟,同时将其他帧周期设置为20厘秒。您还应该注意,我们可以通过在文件名后面加上方括号并使用-1来指示最后一帧,以便访问动画的各个帧。

您现在可以像这样检查由前一个命令引起的各个帧之间的时间/延迟:

identify -format "%f[%s] %T\n" anim.gif 
anim.gif[0] 300   <--- first frame has 3 second frame time
anim.gif[1] 20
anim.gif[2] 20
anim.gif[3] 20
anim.gif[4] 20
anim.gif[5] 20
anim.gif[6] 20
anim.gif[7] 20
anim.gif[8] 20
anim.gif[9] 20
anim.gif[10] 20
anim.gif[11] 300  <--- first frame of second animation also held for 3 seconds
anim.gif[12] 20
anim.gif[13] 20
anim.gif[14] 20
anim.gif[15] 20
anim.gif[16] 20
anim.gif[17] 20
anim.gif[18] 20
anim.gif[19] 20
anim.gif[20] 20
anim.gif[21] 20

你提供给我如此有帮助的帖子。你真是一位聪明、慷慨的人。感谢你花费时间和精力,Mark,为我解释。 - user3650185
太好了!如果能帮助到别人,我可以使用类似这样的循环(convert -delay 10 r.png -delay 0 r.png -delay 10 g.png -delay 0 g.png -delay 0 r.png -morph 8 r2g.gif)。 - Rehmat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接