読者です 読者をやめる 読者になる 読者になる

Imagemagickを使った複数画像の合成

Imagemagickを使って画像を合成する方法がややこしいので整理する。

 Layering -- IM v6 Examples

 

・compositeを使う方法(→JPEGには不向き)

  convert -size 100x100 xc:skyblue comp_resize.gif
  composite -geometry 40x40+5+10  balloon.gif comp_resize.gif comp_resize.gif
  composite -geometry      +35+30 medical.gif comp_resize.gif comp_resize.gif
  composite -geometry 24x24+62+50 present.gif comp_resize.gif comp_resize.gif
  composite -geometry 16x16+10+55 shading.gif comp_resize.gif comp_resize.gif

 

このように、同じファイルを上書きして開いて保存していくことはできる。

As all input images are read in by ImageMagick BEFORE the output image is opened, you can output to one of the input images. This allows you to work on the same image over and over, as shown above, without problems.

 

ただし、この方法はロスが多いのでJPEGには使うな、と注意書きがある。

 Do not do this with a lossy image format like "JPEG" as the format errors are accumulative, and the base image will quickly degrade.

 

・convert を使う方法 (→まあまあ)

  convert -size 100x100 xc:skyblue \
          balloon.gif  -geometry 40x40+5+10   -composite \
          medical.gif  -geometry      +35+30  -composite \
          present.gif  -geometry 24x24+62+50  -composite \
          shading.gif  -geometry 16x16+10+55  -composite \
          compose_geometry.gif

 

ここで、-geometry は、所定の位置に配置するだけではなく、直前の画像を-resizeすると書かれている。

Now the "-geometry" is is a very special operator that not only sets an overlay position for the next "-composite" operation, it will also "-resize" the last image (and only the last image) in the current image sequence.

ただし、これは便利だが使うな、と書かれている。

Note it is recommended that you avoid this 'resize' side-effect of of the "-geometry", even if it is convenient.

リサイズする場合は、以下のように書け、と書かれている。

  convert -size 100x100 xc:skyblue \
          \( balloon.gif -resize 40x40 \) -geometry +5+10   -composite \
          \( medical.gif               \) -geometry +35+30  -composite \
          \( present.gif -resize 24x24 \) -geometry +62+50  -composite \
          \( shading.gif -resize 16x16 \) -geometry +10+55  -composite \
          compose_resize.gif

 

・Drawを使う方法(→画像を変形させる場合は不向き)

 convert -size 100x100 xc:skyblue \
          -draw "image over  5,10 0,0 'balloon.gif'" \
          -draw "image over 35,30 0,0 'medical.gif'" \
          -draw "image over 62,50 0,0 'present.gif'" \
          -draw "image over 10,55 0,0 'shading.gif'" \
          drawn.gif

-drawを使うと、その過程で回転や拡大もできるが、その動きは”トリッキー”だ、と書かれている。→そんなこと書かれると使えない。

 

・Layerを使う方法(→おすすめ)

基本構文は以下。

  convert -size 100x100 xc:skyblue \
          -page +5+10  balloon.gif \
          -page +62+50 present.gif \
........... -layers flatten flatten_canvas.gif

ただし、画像を変形させた後、指定位置に配置しようと思い、以下のように書くとうまくいかなかった。

(うまくいかない例)

 ---------------------------------------

exec ("convert -size 500x1000 xc:white \
-page +10+10 \( aaa.jpg -resize 50x50 \) \
-page +50+100 \( bbb.jpg -resize 50x50 \) \
-layers flatten final.jpg");

 ---------------------------------------

上記の場合、「-page」で指定している位置が、[-resize]の影響を受けるようで、

位置が思う位置に来なかった。

 

結論としては、以下のように書くとうまくいった。

---------------------------------------------

convert -size 500x1000 xc:white \
\( aaa.jpg -resize 50x50 -repage +50+100 \) \
\( bbb.jpg -resize 100x100 -repage +100+200 \) \
-layers flatten final.jpg"

---------------------------------------------

 

 [-repage]は、使用時点でリストに入っている全ての画像に影響を及ぼす。

よって、特定の画像のみに適用させる場合は、括弧を使う。