Rubyで画像処理 【RMagick】

iyamaです。

リア充週間が終わって、腑抜けております。 さて今回もRuby。 今日はRubyをやってるとき、一番ロジックを 考えるのが楽しかったRMagickです。

RMagickとは、Ruby版のImageMagickです。 RMagick

画像ファイルをリサイズしたり、加工したりできます。 それでは、サンプルソースを見てみましょう。

環境

  • Ruby 1.8
  • ImageMagick、RMagickがインストール済みであること

サンプル

リサイズとクロップとファイルサイズチェックのサンプルです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
require 'RMagick'

# 画像ファイルのパス指定
img_path = "public/images/image.jpg"

# 初期化
img = Magick::ImageList.new(img_path)

# 画像リサイズ (width, height)
img = img.resize_to_fit(100, 100 * img.rows / img.columns)


if (img.rows > 60) then
    y = (img.rows - 60) / 2
    # 画像クロップ (x, y, width, height)
    img = img.crop(0, y, 100, 60)
end


# 画像ファイルサイズが大きい場合、
# 圧縮率をかえて保存し直す
i = 90
while i > 5 do
    if (File.size(img_path) >= 2000) then
        img = img.write(img_path){img.quality = i}
    else
        break
    end
    i = i - 10
end

大体はコメントで書いた通りです。 画像のリサイズは横幅100pxで、元画像の比率を維持した場合です。

クロップは縦幅が60pxより大きい場合、センターを中心に60px分抽出する例です。 切り取る四角の頂点を左上を原点に指定します。 例えば元画像のheightが100pxの場合、y = 20となり 縦20pxから60px分クロップします。

File.sizeのメソッドはRMagickではなくRubyのメソッド。 ファイルサイズが想定より大きい場合、圧縮率(img.quality = i)を変更して保存し直します。 iが圧縮率で100〜10%の間で圧縮します。 10%ずつ下げて、最低レベルは10%ということ。

以上です。 今回はRMagickだったけど、PHP+ImageMagickで同じことやっても 基本はかわらないと思います。

Comments