おもこん

おもこんは「思いつくままにコンピュターの話し」の省略形です

RMagickについて

RMagickは、ImagemagickをRubyで使うためのgemです。 gemとは、Rubyのライブラリのことです。

インストール

他のgemと同じように、gemコマンドでインストールします。

$ gem install rmagick

使い方

LinuxのコマンドラインからImagemagickを使うのとは異なります。 RMagickは、Rubyのプログラムにrequireで取り込みMagickモジュールをincludeして使います。 プログラム中では、RubyのクラスであるImageまたはImageListクラスのインスタンスを作成し、インスタンスメソッドをコールして使います。 sample.jpgを読み込んでディスプレイに表示するには次のようにします。

require 'rmagick'
include Magick

i = ImageList.new('sample.jpg')
i.display

以下では、requireとincludeコマンドは、プログラムリストから省略します。

ImageとImageList

画像データはImageオブジェクトとして扱われます。 画像ファイルsample.jpgをImageインスタンスに取り込むには、readクラス・メソッドを使います。

a = Image.read('sample.jpg')
i = a[0]
i.display

画像ファイルには複数のフレームが含まれることがあります。 例えば、アニメーションgifは複数の画像を順次表示することによりアニメーションを実現しています。 そのような画像に対応するため、readメソッドは各フレームをImageインスタンスにし、その配列を返します。 したがって、Image.read('sample.jpg')では1枚の画像(フレーム)からなる配列を返すので、Imageインスタンスを取得するには「i=a[0]」とする必要があります。

ImageListインスタンスはImageインスタンスのリストです。 「リスト」は「配列」のようなものだと考えて構いません。 ImageListには「現在のImage」というのがあり、Imageに対するメソッドを受け取った場合には「現在のImageインスタンス」をレシーバとしてメソッドを実行します。 ImageListに画像ファイルを読み込むには、newクラスメソッドを使います。

以上のことから、ImageListクラスを使うのとImageクラスを使うのに大きな差はありませんが、どちらかというとImageListの方が使いやすいと思います。 次の項目からは、RMagickの3つの使用例を紹介します。

画像形式の変更

JpegからPngに画像形式を変更します。

i = ImageList.new('sample.jpg')
i.write('sample.png')

リサイズ

sample.jpgの画像サイズを240x180に収まるように変更してsmall.jpgとして書き出します。 元の画像の縦横比が240:180=4:3でない場合は、余白が生じますが、その余白は生成された画像に含まれません。 例えば、480x300の元画像をresize_to_fitすると、240x150の画像になります。

i = ImageList.new('sample.jpg')
i = i.resize_to_fit(240,180)
i.write('small.jpg')

画像の重ね合わせ

sample.jpgの上にoverlay.jpgを被せます。 できあがる画像サイズはsample.jpgと同じで、もしoverlay.jpgがそこからはみ出る場合はカットされます。 このような重ね合わせのときの動作は、composte operatorで指定でき、AtopComposteOpはそのひとつです。 Gravityは被せる画像の位置をしていするもので、CenterGravityは中央に配置します。

i = ImageList.new('sample.jpg')
j = ImageList.new('overlay.jpg')
i = i.composite(j, CenterGravity, AtopCompositeOp)
i.write('composite.jpg')

ドキュメント

インターネット上にRMagickのドキュメントがあります。 もしもドキュメントをダウンロードしたい場合は、RMagickのソースをダウンロードします。 そして、doc/index.htmlをブラウザで開けばドキュメントを見ることができます。 また、モジュール、クラス、メソッド全体については、RDocで生成されたドキュメントがあります。