【问题标题】:Imagemagick convert gif creation random image orderImagemagick 转换 gif 创建随机图像顺序
【发布时间】:2021-11-23 23:33:31
【问题描述】:

我有一个名称为 foo<bar>.png 的图像文件夹,其中 <bar> 的范围从 0 到 100。 当我用

创建这些图像的 gif

convert -dispose previous -delay 10 -resize 25% -loop 0 *.png myimage.gif

它会按照 0、1、2、3 的顺序创建一个带有图像的 gif...

有随机选择图片的命令吗?

【问题讨论】:

  • 请问您使用的是什么操作系统?
  • 我在 Windows 上
  • 我的回答或其他人是否解决了您的问题?如果是这样,请考虑接受它作为您的答案 - 通过单击计票旁边的空心对勾/复选标记。如果没有,请说出什么不起作用,以便我或其他人可以进一步帮助您。谢谢。 meta.stackexchange.com/questions/5234/…

标签: imagemagick imagemagick-convert


【解决方案1】:

我可以在 Windows 上告诉你 2/3 的答案,希望其他善良的人可以为你添加其余部分。没有人说答案必须是完整的。

  1. 创建一个包含您要制作动画的 PNG 名称的文本文件。我认为是:

    DIR /B *.png > filelist.txt

  2. 随机播放该文件中的行。我不知道如何在 Windows 中做到这一点。在 Linux 和 macOS 中,它是 shufHere's 一点 Python 等价物:

    python -c "import random, sys; lines = open(sys.argv[1]).readlines(); random.shuffle(lines); print ''.join(lines)," filelist.txt > shuffled.txt

  3. 像这样将该文件传递给 ImageMagick

    convert -loop 0 -delay 80 @filelist.txt animation.gif


如果你得到这个工作,你可以通过使用以下语法来避免对临时文件的需要:

DIR /B *.png | SHUFFLELINES | convert -loop 0 -delay 80 @- animation.gif

【讨论】:

  • 好的,谢谢。我以为Imagemagick中可能有直接的命令。
  • 可能有——如果有的话,希望有人能告诉我们?
  • 在下方(或上方?)查看我的解决方案。
  • 好的,我现在已经成功创建了一个随机顺序的列表。当我在步骤 3 中使用上述 Imagemagick 命令时,我收到一个错误,因为 Windows PowerShell 不希望我使用 @ 运算符。如何在 Windows 中将列表传递给 Imagemagick?
  • 显然反引号是 Powershell 的转义...所以尝试 "backtick" 后跟 @
【解决方案2】:

如果您的 PNG 图片都是相同的尺寸,并且图片的数量可以平均划分为一个网格,例如 72 张图片将组成一个 8 x 9 的图片网格,并且如果您的图片足够小,可以阅读它们全部整合到一个 ImageMagick 命令中,这里有一个命令将随机化一组 72 个输入图像的顺序...

convert *.png -virtual-pixel tile +append -crop 9x1@ -append +repage ^
   -crop 1x9@ -distort affine "0,0 %[fx:floor(rand()*8)*(w/8)],0" -append +repage ^
   -crop 8x1@ -distort affine "0,0 0,%[fx:floor(rand()*9)*(h/9)]" +append +repage ^
   -crop 8x9@ +repage -set delay 10 -loop 0 image.gif

它基本上是一个网格,随机滚动所有行,然后随机滚动所有列。 shuffle 可以很好地分散图像,但是如果您想要更深的 shuffle,请复制并粘贴这两个“-crop ... -distort”行,并将它们添加到前两个下方...

convert *.png -virtual-pixel tile +append -crop 9x1@ -append +repage ^
   -crop 1x9@ -distort affine "0,0 %[fx:floor(rand()*8)*(w/8)],0" -append +repage ^
   -crop 8x1@ -distort affine "0,0 0,%[fx:floor(rand()*9)*(h/9)]" +append +repage ^
   -crop 1x9@ -distort affine "0,0 %[fx:floor(rand()*8)*(w/8)],0" -append +repage ^
   -crop 8x1@ -distort affine "0,0 0,%[fx:floor(rand()*9)*(h/9)]" +append +repage ^
   -crop 8x9@ +repage -set delay 10 -loop 0 image.gif

小心地将“8”和“9”替换为包含您正在使用的图像数量的网格的宽度和高度。我在一个脚本中使用它来洗牌一副扑克牌图像,13 行 4 列。

这在 Windows CMD 语法中使用 ImageMagick v6。在 BAT 脚本中,将所有百分号“%%”加倍。通过将所有续行插入符号“^”更改为反斜杠“\”,它可能会在 *nix 操作系统上工作。对于 ImageMagick v7,使用“magick”而不是“convert”。

【讨论】:

  • 非常有创意,干得好?
  • 这绝对是一种创造性的方式,但我觉得我们应该能够找到一种更优雅的方式。我已经尝试过这种方式并且它有效。但是对于将来的使用,我认为@MarkSetchell 给出的建议更好一些。尽管我在那里遇到了问题,您可以在他的回答中的 cmets 中看到这些问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
相关资源
最近更新 更多