yuw27b’s blog

技術メモと雑記

RMagickでよく使う画像処理

準備

Rubyで画像を編集するのにRMagickというgemを使う。
ImageMagickという画像操作ソフトウェアをRubyから使えるようにするものなので、そもそもOSにImageMagickをインストールしておく必要がある。OSごとの詳細はRMagickのGitHubリポジトリにある:
GitHub - rmagick/rmagick: Ruby bindings for ImageMagick

gemがインストールできたら、

require 'rmagick'
include Magick

で使えるようになる。

よく使う処理

PDFをpngにする
(RからPDFで出力→pngやjpgに変換→Webで表示、とか、PDFでサムネイル作るとか)

画像読み込み

image = ImageList.new(file_path)

サイズが知りたい(縦横のピクセル数)

image.columns
image.rows

任意の部分を切り出して保存

 slice = image.crop(50, 50, 200, 200) #左上が座標(0, 0)で、(50, 50)の位置から(250, 250)までを切り出し

画像を結合

image_list = Magick::ImageList.new("pic1.jpg", "pic2.jpg") { self.quality = 100 }
new_img = image_list.append(true) #true: pic1->pic2(top->bottom), false: pic1->pic2(left->right)
new_img.write("joined.jpg") { self.quality = 100 }

回転

rotated = img.rotate(45) #degree

保存時の画質設定

slice.format = 'JPEG'
slice.write("pic.jpg") {
  self.quality = 100
}

ImageMagickは、JPEG/MIFF*1/PNG保存時のデフォルトのqualityが「75」なので、できるだけきれいに保存したい場合は明示的に「100」を指定する。



ImageMagickは、過去に脆弱性が発覚したこともあるので*2、外部からアクセス可能なサーバにインストールする場合は注意する必要がありそうです。

※私が使っているケースは、

  • Dockerに閉じ込めてサーバーレス+アクセス元を制限
  • 処理する画像の生成元がサーバ内部
  • 機械学習の前処理Python使うのが主流では、と言われればそれはそうなのですが)

などです。

*1:MIFFって何?と思ったらImageMagickの独自フォーマットのようです。

*2:参考: ImageMagickの脆弱性(CVE-2016-3714他)についてまとめてみた - piyolog