MiniMagick を用いて Ruby で ImageMagick (GraphicsMagick) を扱う

MiniMagick

これです。RMagick はしばらくメンテがされていないようなので、現在ではこちらが選択肢になるのではないでしょうか。

使い方

特に変わったところはないです。gem を install して require 'mini_magick' したあとに、ImageMagick のオプションをそのままメソッドとして使います。

単一ファイルを扱う例

ドキュメントに書いてあるままですが、my_image.jpg という単一ファイルを取り扱う場合は以下のように書きます。

require 'mini_magick'

image = MiniMagick::Image.open('my_image.jpg')
image.path #=> 一時ファイルの場所

image.resize '100x100'
image.format 'png'
image.write 'output.png'

これで、my_image.jpg を 100x100 にリサイズして png に変換された output.png というファイルが出力されます。

複数ファイルを扱う例(画像の連結)

複数のファイルを扱う場合はブロックを用います。

例えば、2枚の画像を横に連結する場合は以下のように書きます。

require 'mini_magick'

MiniMagick::Tool::Convert.new do |convert|
  convert.append.+
  convert << 'image_01.jpg'
  convert << 'image_02.jpg'

  convert << 'new_image.jpg'
end

これで、new_image.jpg が生成されます。new_image.jpg は、image_01.jpgimage_02.jpg を横に連結した画像です。

複数ファイルを扱う例(GIFアニメの生成)

GIFアニメを作る場合にも同様にして書けます。

require 'mini_magick'

MiniMagick::Tool::Convert.new do |convert|
  convert.layers 'optimize'
  convert.loop 0
  convert.delay 40

  convert << 'image_01.jpg'
  convert << 'image_02.jpg'
  convert << 'image_03.jpg'
  convert << 'image_04.jpg'
  convert << 'image_05.jpg'

  convert << 'animated_image.gif'
end

これで、image_01.jpgimage_02.jpgimage_03.jpgimage_04.jpgimage_05.jpg が 40ms ごとに切り替わる animated_image.gif という アニメGIFファイル が作られます。

オプションの指定方法

MiniMagick では ImageMagick のコマンドラインのオプションはそのまま「メソッド + 引数」という形で使えます*1。上記の例で分かるように、例えば、

$ convert -layers optimize -loop 0 -delay 40 image_01.jpg image_02.jpg image_03.jpg image_04.jpg image_05.jpg animated_image.gif

とコマンドラインで実行する場合は、上記のアニメGIFの例のようなコードになるわけです。

とはいえ

最後の最後で今までのことを否定するようなことを書きますが、以下のようにオプションを指定するのが GOOD であると公式ドキュメントにはあります。

MiniMagick::Tool::Convert.new do |convert|
  convert << '-layers' << 'optimize'
  convert << '-loop ' << '0'
  convert << '-delay ' << '40'

  convert << 'image_01.jpg'
  convert << 'image_02.jpg'
  convert << 'image_03.jpg'
  convert << 'image_04.jpg'
  convert << 'image_05.jpg'

  convert << 'animated_image.gif'
end

すなわち、オプションを指定する場合には << でチェーンするということです。代入する値は - が付くことに注意です*2。また、例えば label:label_text のようなオプションの場合はそのままこの値を代入すればよいです。

直感的ですし DRY になり得ますのでこちらがいいと思います。

まとめ

ちょっとした画像処理ならば直感的にサクサクっとできるので便利です。

*1:使えない場合もあるかもしれませんが

*2:つまりコマンドラインでのオプションの記述そのまま

Powered by はてなブログ