ImageMagick:结合多个蒙太奇'将命令合并为一个以获得性能

时间:2015-04-19 08:58:24

标签: performance merge imagemagick montage

我有一个脚本可以拍摄4张照片并复制它们以生成8张小图片。该脚本还为输出添加了背景。

这是我的期望:

http://img11.hostingpics.net/pics/831624stack.png

我有一个效果很好的代码。但它需要保存多个临时图像。

所以我一直在寻找是否可以合并脚本的命令来只获得一个图像保存操作。目标是使脚本更快完成。

//Make image smaller:
    convert /home/pi/images/*.png -resize 487x296 -flop \
      -set filename:f "/home/pi/imagesResized/%t%p" '%[filename:f]'.png

//Make one column from 4 images:
    montage /home/pi/imagesResized/*.png -tile 1x4 \
      -geometry +0+15 -background none  /home/pi/line.png

//Duplicate to two columns:
    montage /home/pi/line.png /home/pi/line.png -tile 2x1 \
      -geometry +45+0 -background none /home/pi/photos.png

//Add the background image:
    suffix=$(date +%H%M%S)
    montage /home/pi/photos.png -geometry +20+247 \
         -texture /home/pi/data/background_photo.png \
          /home/pi/photo_${suffix}.jpg

2 个答案:

答案 0 :(得分:1)

由于我没有您的图像或纹理或尺寸,我会告诉您类似的东西让您适应......

制作一些输入图像:

convert -size 500x400 xc:black 1.png
convert -size 500x400 xc:red 2.png
convert -size 500x400 xc:green 3.png
convert -size 500x400 xc:blue 4.png

和背景纹理:

convert -size 2000x2000 xc:gray +noise gaussian background.png

现在按照你的要求做,但没有中间文件到磁盘:

montage [1234].png -background none -tile 1x4 -geometry +0+15 miff:- |
  convert -background none :- -size 15 xc:none -clone 0 +append png: | 
  convert -gravity center background.png :- -composite z.png

enter image description here

第一行将4个图像一个放在另一个上面,并通过管道将合并结果以MIFF(多图像文件格式)发送到下一个命令。第二个命令从管道中读取一个图像,并附加一个15像素宽的“spacer”,然后复制第一列图像(使用clone)并通过另一个管道写入PNG到下一个命令。最后一个命令将8个小图像组合在一起并将它们放在背景上,居中。

如果图像的右侧列应该是反映的左列 - 很难从您的可怜示例中看出哪个显示黑色扁平框 - 您可能需要更改命令的第二行

  convert -background none :- -size 15 xc:none -clone 0 +append png: | 

  convert -background none :- -size 15 xc:none \( -clone 0 -flop \) +append png: | 

答案 1 :(得分:0)

这是另一个答案。它从Mark Setchell的方法中获得灵感。在这里,我想出了一个新的命令管道。不同的是,我......

  • ...在管道中专门使用3个montage命令(Mark在其管道中使用了1 montage和2 convert},而我
  • ...完全重现OP的3个不同命令的输出。

作为输入,我在另一个答案t{1,2,3,4}.png中使用了Ghostscript命令创建的四个图像。

为了创建一个合适的背景图像,我使用了Mark的命令,虽然修改了:我使图像稍微小一点,这样OP中的-texture运算符可以通过有意义的使用:

convert -size 200x200 xc:gray +noise gaussian background.png

然后我对所有三个命令/脚本进行了基准测试,......

  1. ... OP命令作为shell脚本,
  2. ...... Mark的方法,虽然如上所述进行了修改,
  3. ...我的初步方法,通过添加背景图片进行了修改。
  4. 对于基准测试,我确实每次重复100次。 这样做的时候,我在一个单独的终端窗口中大致同时启动了每个脚本/命令。 测试机器上的CPU有4个核心。 因此,当命令并行运行时,它们必须处理相同的CPU和I / O负载,相互竞争资源。 这是最公平的" ad-hoc性能测试设置我可以提出。

    我还确认3次测试(photo_test1.jpgms+kp_test2.jpgkp_test3.jpg)创建的输出文件按像素(几乎)相同。 如果输出切换到PNG(而不是JPEG,OP要求的方式),那么这三个方法之间的这些小差异也会消失。

    结果如下:

    脚本使用原始帖子(OP)中的4个命令:

    mkdir ./imagesResized
    time for i in {1..100}; do
        convert t*.png -resize 487x296\! -flop                   \
          -set filename:f "./imagesResized/%t%p" '%[filename:f]'.png    
        montage ./imagesResized/*.png -tile 1x4 -geometry +0+15  \
                -background none line.png    
        montage line.png line.png -tile 2x1 -geometry +45+0      \
                -background none photos.png
    
        montage photos.png -geometry +20+247                     \
                -texture background.png                          \
                 photo_test1.jpg    
    done
    

    <强>结果:

      

    真实2m13.471s
      用户1m54.306s
      sys 0m14.340s

    实时大约133秒。

    将此作为100%的时间消耗。

    受马克答案启发的修改后的命令管道:

    time for i in {1..100}; do
      montage t[1234].png -resize 487x296\! -flop -background none \
             -tile 1x4 -geometry +0+15 miff:-                      \
        | montage :- -background none -clone 0 -tile 2x1 -geometry +45+0 miff:- \
        | montage :- -geometry +20+247 -texture background.png ms+kp_test2.jpg ;
    done
    

    <强>结果:

      

    真实1分50.125秒
      用户1m32.453s
      sys 0m16.578s

    大约110秒。

    与原始命令相比,耗时约为83%。

    我的原始命令,现在已完成,缺少背景合成:

    time for i in {1..100}; do
        convert t*.png -flop -resize 487x296\! \
              -background none     \    
              -size 0x15           \    
               xc:white            \    
              -duplicate 7         \    
              -insert 0            \    
              -insert 2            \    
              -insert 3            \    
              -insert 5            \    
              -insert 6            \    
              -insert 8            \    
              -insert 9            \    
              -append              \    
              \( +clone -size 90x0 xc:white +swap \) \ 
              +append              \    
              -transparent white   \
               miff:-              \    
        | montage :- -geometry +65+247 -texture background.png kp_test3.png
    done 
    

    <强>结果:

      

    真实1m34.786s
      用户1m20.595s
      sys 0m13.026s

    大约95秒。

    与原始命令相比,耗时约为72%。