お遊びでよく使うハンドサイン画像ジェネレータを作った時に覚えたRMagickの使い方をメモする。
なお以下のソースコードはすべて事前にrequire 'RMagick'
してinclude Magick
されているものとする。
画像の読み込みと生成
画像をRMagickで読み込むにはImageList.new
を使う。引数にはパスを指定する。
imagelist = ImageList.new('foo.jpg')
空白の画像を新たに生成するにはImage.new
を使う。引数には幅と高さを指定する。
image = Image.new(640, 480)
ImageList
はImage
の集合体である。 複数のファイルを同時に読み込む場合があることや、GIFやTIFFなど1ファイルに複数の画像を含む画像フォーマットがあるため、このような仕組みになっている。
さらに補足となるが、ImageList
からImage
を取り出すには、ImageList#cur_image
を使う。このメソッドはImageList#scene
が示すインデックスの画像をImage
オブジェクトで返す。
文字の描画
画像に線や文字を描画するにはDraw
オブジェクトを使う。Draw
オブジェクトは描画時の各種プロパティを保持し、Draw
オブジェクトのメソッド呼び出しで実際に描画を行う際はそのプロパティに従って描画される。
文字を描画するにあたって重要なのはフォントの指定である。デフォルトでは英語のフォントしか使えないため、日本語を描画しようとすると正しく描画されない。フォントの指定はDraw#font=
でフォントやフォントファイルのパスを指定する。
draw = Draw.new
draw.font = 'mplus-1c-regular.ttf' # カレントディレクトリのフォントファイルを指定する例
文字の描画に関わる他のプロパティとして、文字のフォントサイズを指定するDraw#pointsize
や、文字の描画位置を指定するDraw#gravity
がある。以下はフォントサイズを16ptに、文字を上下左右に中央寄せで描画するように指定する例である。
draw.pointsize = 16
draw.gravity = CenterGravity
以上で準備は整った。文字の描画にはDraw#annotate
を使う。引数には文字を描画する画像、幅、高さ、X座標、Y座標、描画する文字を指定する。
draw.annotate(image, 100, 200, 300, 400, "foo")
画像の描画
ある画像の内容をそのまま別の画像に描画するには、Image#composite
を利用する。メソッドのレシーバになる画像に、引数で与えた画像の内容が描画される。引数には画像と描画するX座標とY座標、オプションを与える。画像はImage
でもImageList
でも構わない。オプションMagick::OverCompositeOp
は画像を上書き描画する指定である。
dest.compoiste(src, 100, 200, OverCompositeOp)
画像の表示
画像を画面で確認するにはImage#display
またはImageList#display
を使う。この命令が実行されるとウィンドウがポップアップして画像が表示される。ウィンドウが閉じられるまで処理はブロックするので、あくまでデバッグ用である。
image.display
画像の保存
画像の保存はImage#write
またはImageList#write
で行う。 引数にはファイルのパスを指定する。 画像のフォーマットはパスで指定した拡張子に応じて自動的に決まる仕組みである。
image.write('foo.jpg')