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.jpg
と image_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.jpg
、image_02.jpg
、image_03.jpg
、image_04.jpg
、image_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 になり得ますのでこちらがいいと思います。
まとめ
ちょっとした画像処理ならば直感的にサクサクっとできるので便利です。