ImageMagickで複数の画像を重ねあわせる

  • 5
    Like
  • 0
    Comment
More than 1 year has passed since last update.

やりたいこと

透過png画像Aと透過png画像Bを重ねあわせた新しい透過png画像Cを作る

これと

umaru.png

これを合わせて

seiva.png

こんなのを作る(全部背景透過のPNG)

done.png

やりかた

1. ImageMagickのインストール

Macであれば

$ brew install imagemagick

2. ライトセイバーの回転

ImageMagickのconvertコマンドでできる。
-backgroundを指定しないと白背景になってしまうので必ず指定する。

convert -background 'rgba(0,0,0,0)' -rotate -45 saber.png saber_rotated.png

3. 合成

まず背景領域を設定して、そこに配置していく流れ。

#ここで rotate をやろうとすると全体が回転してしまうのでやらない

$ convert -size 440x370 xc:none \
      umaru.png -geometry +210+110 -composite \
      saber_rotated.png -geometry +0+0 -composite \
      result.png

(参考)上記をRubyでまるっとできるようにしたら苦労した

example.rb
Image = Struct.new(:path, :point_x, :point_y, :rotate)

# umaru.pngの(115, 14)の点とsaber.pngの(25, 296)の点を重ねあわせる回転は45度
umaru = Image.new("umaru.png", 115, 14, 0)
saber = Image.new("saber.png", 25, 296, 45)

ImageComposer.new([umaru, saber]).compose

こんな感じで実行できるようにしたんですが、rotateすると元の点の座標が変わってしまうので、回転後の座標に直したり、全体のサイズを -size で指定してしないと行けないので計算する必要があったりと地味に面倒でした。

実際にやったのは更にいくつか条件入っていたりなのでコード載せられないのですが、久々にsinとかcosとかatan2とか使いました。

ちなみにrmagickはよくわからなかったので convert を system メソッドで実行していて、画像サイズの取得とかも必要だったのでそれもrmagickではなくfastimageを使って簡単に取得しました。