是非に及ばず

プログラミングに関する話題などを書いていきます(主にRailsやAndroidアプリ開発について)

RMagickでJPEGを保存する際のクオリティの設定方法その2

前回の記事で、RMagickはJPEGにフォーマット変換する時に一時的にファイルへ保存しないと画質変更が出来ないと書いたんだけど、一時ファイルを作らずに画質の設定/変更が出来る事が分かったのでメモ。

まずは、普通にJPEGに変換

これでもOKだけど、いちいちファイルに保存しなくてはいけない

require 'rubygems'
require 'RMagick'

path = './sample.png'
image = Magick::Image.read(path).first
image.format = 'JPEG'
tmp_path = '/tmp/sample.jpg'
image.write(tmp_path) {
  self.quality = 95
}
File.delete(tmp_path)

ファイルに保存せずにJPEG変換&画質設定

こっちがよりベストだと思う方法。

require 'rubygems'
require 'RMagick'

path = './sample.png'
save_path = './sample.jpg'
image = Magick::Image.read(path).first
image.format = 'JPEG'
image = Magick::Image.from_blob(image.to_blob {self.quality = 95}).first

ポイントはto_blobの時にもself.quality = qualityが使えるという事。
to_blobで画像データを読み直してるからアレだけど、
メモリ上で処理しているので処理が速いと思うし、一時ファイルを作らずに済むのでこれは楽。
このサンプルだと利便性が分かりにくいけど、例えば携帯端末の画面サイズに合わせて
動的に画像のサイズとフォーマットを変換して出力するような処理の時にこれが効いてくる。
今まで、JPEGに変換する時だけ一時ファイル作ってたorz