use*_*185 2 php ffmpeg image imagemagick
我正在使用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;
Run Code Online (Sandbox Code Playgroud)
每张图像必须保持9秒钟不失真,然后快速转换为下一张图像.
目前,Fred的脚本允许两个图像输入.脚本中是否可以使用两个以上的图像?如何用PHP循环遍历多个图像?
不知道你在3天内用ImageMagick设法收集了什么 - 它是一个非常有用的软件,你可以花一辈子的时间.无论如何,让我们做一些动画,看看我的ramblings是否可以帮助你.
首先,我们制作一个红色,绿色和蓝色图像:
convert -size 100x100 xc:red r.png
convert -size 100x100 xc:green g.png
convert -size 100x100 xc:blue b.png
Run Code Online (Sandbox Code Playgroud)
然后我们从红色变为绿色,有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
Run Code Online (Sandbox Code Playgroud)
我们也可以做同样的绿色到蓝色
convert -delay 20 g.png b.png -morph 8 g2b.gif
Run Code Online (Sandbox Code Playgroud)
这给了我们这些家伙:


思想1
我想告诉你的第一件事是你可以将动画GIF与ImageMagick连接在一起,如下所示:
convert r2g.gif g2b.gif both.gif
Run Code Online (Sandbox Code Playgroud)
所以你先从红色变为绿色,然后从绿色变为蓝色.

关键是,如果您使用Fred的脚本,您可以将动画A加入到动画B中.因此,只要您可以在2个点(您可以)之间设置动画,就可以通过连接两个动画来设置第三个点的动画,因此您不需要将超过2个点传递给Fred的脚本.
思想2
该-delay参数是一个设置而不是一个操作,因此它将保持设置直到命令结束或更改为止.因此,您可以使帧延迟一帧,然后恢复到更短的时间,以便后续帧如下所示:
convert -delay 300 r2g.gif[0] \
-delay 20 r2g.gif \
-delay 300 g2b.gif[0] \
-delay 20 g2b.gif \
staccato.gif
Run Code Online (Sandbox Code Playgroud)

基本上,我们暂停动画的第一帧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
Run Code Online (Sandbox Code Playgroud)