【问题标题】:Imagemagick transitions between multiple images -- need idea多个图像之间的 Imagemagick 转换 - 需要想法
【发布时间】:2015-09-20 06:50:52
【问题描述】:

我正在使用 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 遍历多个图像?

【问题讨论】:

    标签: php image ffmpeg imagemagick


    【解决方案1】:

    不确定您在 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
    

    这给了我们这些人:

    想法1

    我想告诉你的第一件事是,你可以像这样将动画 GIF 与 ImageMagick 连接在一起:

    convert r2g.gif g2b.gif both.gif
    

    所以你首先从红色到绿色,然后从绿色到蓝色。

    关键是,如果您使用 Fred 的脚本,您可以将 animation A 加入到 animation 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
    

    基本上,我们将动画的第一帧暂停 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
    

    【讨论】:

    • 你给我的帖子这么有用。确实是个才华横溢、慷慨大方的人。谢谢你的时间和精力,马克,为我解释。
    • 太棒了!如果它对某人有帮助,那么我可以使用这样的东西进行循环。 (转换 -delay 10 r.png -delay 0 r.png -delay 10 g.png -delay 0 g.png -delay 0 r.png -morph 8 r2g.gif)
    猜你喜欢
    • 2019-08-08
    • 2015-08-08
    • 2012-02-19
    • 2012-09-18
    • 2012-03-31
    • 2016-11-22
    • 2016-11-14
    • 1970-01-01
    • 2014-07-02
    相关资源
    最近更新 更多