【问题标题】:Imagemagick commands to resize, rotate, wrap, and combine images调整图像大小、旋转、换行和组合图像的 Imagemagick 命令
【发布时间】:2019-10-29 20:26:42
【问题描述】:

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

Comic Covers

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

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

【问题讨论】:

  • 1000x100 拼贴画中通常有多少张图片?典型的输入尺寸是多少?您使用的是 Imagemagick 6 还是 7?
  • 它可以变化 - 但通常是 1000x1000 拼贴中的 15 张左右的图像。图像输入大小各不相同,但我可以使用 resize 命令将它们全部设为 250px 宽。版本:ImageMagick 7.0.8-59

标签: command imagemagick


【解决方案1】:

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

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 透明画布的中心。

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

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

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

【讨论】:

    【解决方案2】:

    这是一个带有图像列表的 bash Imagemagick 6 脚本。您可以将其替换为您的图像。它使用 subshel​​l 处理来避免需要将临时图像写入磁盘。它将图像保存为 miff: 格式作为循环中的一个文件。然后它将多页 miff: 文件传递​​给 -layers 合并,它将图像覆盖到 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
    


    【讨论】:

    • 给我们看照片!给我们看照片! ;-)
    • 我的图片只有4个小图,所以没有填满1000x1000的区域。所以我认为它不值得发布。
    【解决方案3】:

    酷,我会试试 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
    

    【讨论】:

      猜你喜欢
      • 2017-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-26
      相关资源
      最近更新 更多