用于调整图像大小、旋转、环绕和组合图像的 Imagemagick 命令

Imagemagick commands to resize, rotate, wrap, and combine images

我目前正在使用 Photoshop 调整大小、随机旋转和随机环绕图像来创建这种类型的蒙太奇....

Comic Covers

我开始思考这种事情在 Imagemagick 中应该是可行的。我知道如何单独使用所有命令,我可以使用 BASH 进行随机旋转和环绕,但我无法从单个图像中获取单个图像。

假设源图片尺寸不同但应调整为 250px 宽。图像将被命名为 image1.jpg、image2.jpg 等。还假设目标应为 1000x1000 像素。根据我有多少张图片,可能无法覆盖整个 1000x1000 图片 - 我理解这一点。我主要使用 BASH,但我有几个不同的环境和 shell 可供我使用。

这是一个 bash Imagemagick 6 脚本,它获取图像列表。您可以将其替换为您的图像。它使用子外壳处理来避免将临时图像写入磁盘的需要。它以 miff: 格式将图像保存为循环中的一个文件。然后它将多页 miff: 文件通过管道传输到 -layers merge,将图像叠加到 1000x1000 透明基础图像上。对于 Imagemagick 7,将 convert 替换为 magick。

list="lena.jpg barn.jpg mandril3.jpg zelda1.jpg"
convert -size 1000x1000 xc:none result.png
(
for img in $list; do
angle=`convert xc: -format "%[fx:round(-22.5+45*(rand()))]" info:`
xoff=`convert xc: -format "%[fx:round(1000*rand())]" info:`
yoff=`convert xc: -format "%[fx:round(1000*rand())]" info:`
#echo >&2 "angle=$angle; xoff=$xoff; yoff=$yoff"
convert "$img" -resize 250x -background none -rotate $angle -set page +${xoff}+${yoff} miff:-
done
) | convert result.png - -layers merge +repage result.png


如果你有足够的资源来一次保存所有图像,那么你也可以在一个命令行中完成,如下所示:

convert -size 1000x1000 xc:none \
\( lena.jpg barn.jpg mandril3.jpg zelda1.jpg -virtual-pixel none -background none \
+distort SRT "0,0 %[fx:250/w] %[fx:-22.5+45*rand()] %[fx:rand()*1000],%[fx:rand()*1000]" \) \
-layers merge +repage result.png


太棒了,我会试试 fmw42 的脚本,但这是我想出的脚本。它生成临时文件(它删除)和几个转换命令,但它确实有效....

# Create blank montage...
convert -size 750x750 xc:black montage.jpg


for file in $(ls hall*.jpg | grep -v halloweencovers.jpg); do
    echo $file

    angle=$RANDOM; let "angle %= 32"; let "angle = angle - 16"; let "angle = angle * 5"
    offsetx=$RANDOM; let "offsetx %= 75";let "offsetx = offsetx * 10"; offsetx="+$offsetx"
    offsety=$RANDOM; let "offsety %= 75";let "offsety = offsety * 10"; offsety="+$offsety"

    # Create blank image...
    convert -size 750x750 xc:transparent blank.png

    # create 250px image and rotate....
    convert $file -resize 250x -alpha set -background none -rotate $angle out.png

    # add 250px image to blank 750x750 canvas
    convert blank.png out.png -composite output.png

    # offset and wrap blank canvas with output image
    convert output.png -roll ${offsetx}${offsety} output2.png

    # merge montage with offset image
    convert montage.jpg output2.png -composite montage.jpg

    # clean up
    rm -f out.png output.png output2.png blank.png
done

使用 ImageMagick 6 或 7,如果您有足够的内存一次读入所有图像,您可以调整它们的大小,随机旋转它们,并将它们全部放置在 1000x1000 canvas 的随机位置这样的命令...

convert granite: -duplicate 11 -resize 250x \
   -background none -gravity center -extent 1000x1000 \
   -distort SRT "%[fx:rand()*45-22.5]" -virtual-pixel tile \
   -distort affine "%[fx:w/2],%[fx:h/2] %[fx:rand()*w],%[fx:rand()*h]" \
   -flatten result.png

使用 ImageMagick 内置图像 "granite:" 复制了 11 次以上。将 "granite: -duplicate 11" 替换为您的输入文件列表。

首先将它们全部调整为 250 像素宽,然后将它们分别放置在 1000x1000 透明 canvas.

的中心

真正的工作是在扭曲操作中完成的。第一个“-distort SRT”将每个图像旋转 -22.5 到 +22.5 度之间的随机量。然后“-distort affine”将每个图像重新定位到 canvas 内的随机位置。超出 canvas 的图像的任何部分都将回滚到另一侧。这使得结果适合平铺。

此命令将图像之间可能显示的所有内容拼合到透明背景上。例如,在“-flatten”操作之前添加“-background blue”以将背景更改为蓝色。

这适用于我 bash 中的 IM 6。对于 Windows 中的 IM 6,将续行反斜杠“\”更改为脱字符“^”。对于 IM 版本 7,将 "convert" 更改为 "magick"。