RMagickによるオンメモリの画像処理
タグ: rubyprogramming / 初版公開: 2013-12-27

RMagickはImageMagickをRubyで使えるようにしたラッパーである。

今回このRMagickでファイルを介さずオンメモリで画像処理を行いたい要件があったのだが、ざっと調べてもオンメモリでRMagickを使用する例が見当たらなかった。ImageMagickは基本的にファイルを別のファイルに変換する使い方をするためだろう。

そこでRMagickとImageMagickのAPIを眺めていたら、from_blobto_blobというAPIを使えばオンメモリで処理が可能だとわかったので、これらのAPIの使い方を書き残しておこうと思う。

この方法は、変換元の画像がリモートに存在する場合や、出力先がファイルではなくデータベースである場合などで、中間ファイルを生成せずにRMagickによる画像処理を行う際に利用できる。

画像の入力

ImageListのインスタンスが欲しい場合は、いったん空のImageListを生成してから、ImageList#from_blobを呼ぶ。変数dataには事前に読み込んだ画像のバイナリデータが格納されているものとする。

imagelist = RMagick::ImageList.new
imagelist.from_blob(data)

ImageListではなくImageが欲しい場合は、Image.from_blobで直接Imageインスタンスの配列を得ることもできる。画像が複数枚で構成されるケースがあるので、このメソッドの返却値はImageではなく配列であることに注意しよう。画像のバイナリデータから最初のImageインスタンスを取得する例を以下に示す。

image = RMagick::Image.from_blob(data)[0]

画像の出力

ImageまたはImageListの画像のバイナリデータを得るにはto_blobメソッドを使う。以下の例は変数dataに画像imageのバイナリデータを保存する例である。

data = image.to_blob

to_blobメソッドはブロックでオプションを指定することができる。オプションには出力する画像の形式や品質を指定できる。以下はimageの画像を品質60のJPEG画像に変換して、そのバイナリデータを得る例である。

data = image.to_blob do
	self.format = "JPG"
	self.quality = 60
end