ruby:minimagick
MiniMagick
MiniMagick は Ruby で ImageMagick や GraphicsMagick の画像処理コマンドを使うためのライブラリである。 RMagick に比べてメモリ消費量が少ない。
インストール
gem を使って最新バージョンをインストールする。
% gem install mini_magick
Ubuntu では以下のパッケージが必要なのでインストールしておく。
- imagemagick
- graphicsmagick
Ubuntu ではパッケージ ruby-mini-magick があるが、バージョンが古くて機能が足りないかもしれない。
プログラム例
画像ファイルの読み書き
画像ファイル input.png を読み込み、画像ファイル output.png に書き込む。
- inout.rb
- #!/usr/bin/ruby
- # coding: utf-8
- require "mini_magick"
- # 画像ファイルの読み込み
- image = MiniMagick::Image.open("input.png")
- # 画像ファイルの書き込み
- image.write("output.png")
画像の新規作成
画像を新規作成し、画像ファイル output.png に書き込む。
- 画像用の配列 pix を用意して、配列で各ピクセルの色をいじった後、画像化して書き込む。
- 画像のサイズは幅を width、高さを height とする。
- 画像のピクセルの座標は (x,y) で表す。
- 横方向を x で表し、左から 0, 1, 2, …, width-1 の値をとる。
- 縦方向を y で表し 上から 0, 1, 2, …, height-1 の値をとる。
- 各ピクセルは色を R, G, B(赤, 緑, 青)の 3 つの値で設定する。値は 0 から 255 の間の整数をとる。
- 配列 pix は3次元配列で、pix[y][x][c] で各要素を指定し、要素の値は R, G, B のどれかの値になる。
- x と y はピクセルの座標。
- c は RGB のいずれかを意味し、R なら 0、G なら 1、B なら 2 を使う。
- newimage.rb
- #!/usr/bin/ruby
- # coding: utf-8
- require "mini_magick"
- # 画像の幅
- width = 8
- # 画像の高さ
- height = 16
- # 画像用配列を用意して白で初期化する
- # pix[y][x][c]
- # y:y座標 0,1,2,...,height-1
- # x:x座標 0,1,2,...,width-1
- # c:RGB 0,1,2
- # 各要素の値は 0 から 255 までの整数
- pix = Array.new(height) { Array.new(width) { Array.new(3, 255) } }
- # ピクセルをいじる
- #
- # pix[0][0][0] = 0
- # pix[0][0][1] = 255
- # pix[0][0][2] = 255
- # は
- # pix[0][0] = [0, 255, 255]
- # とまとめて書いてもよい
- pix[0][0] = [0, 255, 255]
- pix[0][1] = [255, 0, 0]
- pix[0][2] = [0, 0, 0]
- pix[1][0] = [0, 0, 255]
- pix[1][1] = [95, 158, 160]
- pix[1][2] = [0, 0, 128]
- pix[2][0] = [255, 192, 203]
- pix[2][1] = [255, 165, 0]
- pix[2][2] = [255, 255, 0]
- # 配列から画像にする
- image = MiniMagick::Image.get_image_from_pixels(pix,
- [width, height],
- "rgb",
- 8,
- "png")
- # 画像ファイルの書き込み
- image.write("output.png")
画像の上下反転
画像ファイル input.png を読み込み、y方向に上下反転して画像ファイル output.png に書き込む。
- 読み込んだ画像は一度、配列にして上下反転の処理をした後、画像化して書き込む。
- 上下反転の処理は each do を使って1ピクセルずつ処理する(効率は悪いが例として分かりやすくしている)。
- 例えば
- 水色のピクセルの座標は (0,0) で、上下反転すると (0,height-1) になる。
- 黄色のピクセルの座標は (1,1) で、上下反転すると (1,height-2) になる。
- flip_vertical.rb
- #!/usr/bin/ruby
- # coding: utf-8
- require "mini_magick"
- # 画像ファイルの読み込み
- image = MiniMagick::Image.open("input.png")
- # 画像の幅
- width = image.width
- # 画像の高さ
- height = image.height
- # 読み込んだ画像を配列にする
- pix1 = image.get_pixels
- # 書き込む画像用の配列を用意する
- pix2 = Array.new(height) { Array.new(width) }
- # y座標を反転する
- (0..(height - 1)).each do |y2|
- (0..(width - 1)).each do |x2|
- x1 = x2
- y1 = height - y2 - 1
- pix2[y2][x2] = pix1[y1][x1]
- end
- end
- # 配列から画像にする
- image = MiniMagick::Image.get_image_from_pixels(pix2,
- [width, height],
- "rgb",
- 8,
- "png")
- # 画像ファイルの書き込み
- image.write("output.png")
円の描画
円を描画して画像 output.png に書き込む。
- 極座標 $(r,\phi)$ を考え、$r$ を固定しつつ $\phi$ を 0° から 359° まで 1° ずつ動かして、その座標のピクセルを塗りつぶしていく。
- 極座標 $(r,\phi)$ からピクセルの座標 $(x,y)$ への変換は三角関数を用いる。
\begin{eqnarray*} x&=&r\cos\phi\\ y&=&r\sin\phi \end{eqnarray*}
- 三角関数の引数はラジアンなので、角度からラジアンに変換が必要。
\[ ラジアン=角度\times \frac{\pi}{180} \]
この方法は三角関数の説明のためのもので、きれいな円を描画するには他によいアルゴリズムがある。
- circle1.rb
- #!/usr/bin/ruby
- # coding: utf-8
- require "mini_magick"
- # 画像の幅
- width = 300
- # 画像の高さ
- height = 300
- # 画像用配列を用意して白で初期化する
- pix = Array.new(height) { Array.new(width) { Array.new(3, 255) } }
- # 円の中心
- x0 = width / 2
- y0 = height / 2
- # 円の半径
- r = 100
- # 円の描画
- (0..359).each do |i|
- # 角度からラジアンに変換
- phi = i * Math::PI / 180
- # (x,y)座標の計算
- x = (r * Math.cos(phi)).round + x0
- y = (r * Math.sin(phi)).round + y0
- # 座標のピクセルを塗る
- pix[y][x] = [0, 0, 0]
- end
- # 配列から画像にする
- image = MiniMagick::Image.get_image_from_pixels(pix,
- [width, height],
- "rgb",
- 8,
- "png")
- # 画像ファイルの書き込み
- image.write("output.png")
ruby/minimagick.txt · 最終更新: 2024/05/26 03:27 by you