使用ImageMagick转换附加图像

时间:2014-05-25 07:07:42

标签: graphics bitmap imagemagick imagemagick-convert

所以我有一堆我希望垂直追加的图像:

convert *.png -append output.png

但是我遇到了两个问题:

  1. 并非所有图像都具有相同的宽度。因此,宽度小于最宽图像的图像后面会留下空白,因为它们是左对齐的。
  2. 图像之间没有间距。
  3. 如何对齐所有图像并指定它们之间的间距?

2 个答案:

答案 0 :(得分:5)

只需使用ImageMagick的montage实用程序即可。将图像与-gravity& -extent个选项,并使用-geometry调整间距。

montage fishscales.png circles.png verticalsaw.png \
        -tile 1x -geometry +10+10 \
        -gravity Center -extent 120 \
        out.png

montage example

答案 1 :(得分:1)

我的方法是shell脚本,如下所示:

1. Run a loop over all your images and find the width of the widest (using ImageMagick `identify`) - say 8 to 10 lines of shell script

2. Create a transparent "spacer image" the same width as the widest image and the height you want for vertically spacing images - one line of shell script

3. Run a loop over all your images first adding the transparent "spacer" to the bottom of the existing output image then compositing images that are narrower than your widest image onto a transparent background the width of your widest image - then appending that to the output image - maybe 15 lines of shell script.

这是三张图片的输出:

红色= 80px宽

绿色= 180像素宽

蓝色= 190px宽

enter image description here

这种方法是否适合你 - 我可能会在其他事情之间的一两天内编写代码!

这就是我的意思:

#!/bin/bash
# User-editable vertical spacing between images
SPACING=10

function centre() {
   echo DEBUG: Centering $1
   TEMP=$$tmp.png
   w=$(convert "$1" -ping -format "%w" info:)
   h=$(convert "$1" -ping -format "%h" info:)
   convert -size ${MAXW}x${h} xc:"rgba(0,0,0,0)" PNG32:$TEMP
   composite -resize '1x1<' -gravity center "$1" $TEMP $TEMP
   if [ $2 -eq 0 ]; then
      mv $TEMP output.png
   else
      convert output.png $TEMP -append output.png
      rm $TEMP 
   fi
}

# Step 1 - determine widest image and save width in MAXW
MAXW=0
for i in *.jpg; do
   w=$(convert "$i" -ping -format "%w" info:)
   [[ $w -gt $MAXW ]] && MAXW=$w
   echo DEBUG: Image $i width is $w
done
echo DEBUG: Widest image is $MAXW

# Step 2 - Create transparent spacer image, with width MAXW
convert -size ${MAXW}x${SPACING} xc:"rgba(0,0,0,0)" PNG32:spacer.png

# Step 3 - Build output image
n=0
for i in *.jpg; do

   # Add a vertical spacer if not first image
   [[ $n -ne 0 ]] && convert output.png spacer.png -append output.png

   # Centre image horizontally and append to output
   centre "$i" $n

   ((n++))
done

另一个完全不同的选择是添加N个图像的所有高度并创建透明画布,最宽图像的宽度和所有图像的高度加上(N-1)*垂直间距。然后将图像叠加到画布上的正确位置 - 这涉及更多的数学和更少的处理和图像的再处理,这可能意味着这种方法的质量将低于我建议的方法。我会用PerlMagick做这个方法,因为它比bash更适合数学。