MiniMagick

MiniMagick は Ruby で ImageMagickGraphicsMagick の画像処理コマンドを使うためのライブラリである。 RMagick に比べてメモリ消費量が少ない。

インストール

gem を使って最新バージョンをインストールする。

% gem install mini_magick

Ubuntu では以下のパッケージが必要なのでインストールしておく。

Ubuntu ではパッケージ ruby-mini-magick があるが、バージョンが古くて機能が足りないかもしれない。

プログラム例

画像ファイルの読み書き

画像ファイル input.png を読み込み、画像ファイル output.png に書き込む。

inout.rb
  1. #!/usr/bin/ruby
  2. # coding: utf-8
  3.  
  4. require "mini_magick"
  5.  
  6. # 画像ファイルの読み込み
  7. image = MiniMagick::Image.open("input.png")
  8.  
  9. # 画像ファイルの書き込み
  10. image.write("output.png")

画像の新規作成

画像を新規作成し、画像ファイル output.png に書き込む。

ピクセルの座標と色

newimage.rb
  1. #!/usr/bin/ruby
  2. # coding: utf-8
  3.  
  4. require "mini_magick"
  5.  
  6. # 画像の幅
  7. width = 8
  8.  
  9. # 画像の高さ
  10. height = 16
  11.  
  12. # 画像用配列を用意して白で初期化する
  13. # pix[y][x][c]
  14. # y:y座標 0,1,2,...,height-1
  15. # x:x座標 0,1,2,...,width-1
  16. # c:RGB 0,1,2
  17. # 各要素の値は 0 から 255 までの整数
  18. pix = Array.new(height) { Array.new(width) { Array.new(3, 255) } }
  19.  
  20. # ピクセルをいじる
  21. #
  22. # pix[0][0][0] = 0
  23. # pix[0][0][1] = 255
  24. # pix[0][0][2] = 255
  25. # は
  26. # pix[0][0] = [0, 255, 255]
  27. # とまとめて書いてもよい
  28. pix[0][0] = [0, 255, 255]
  29. pix[0][1] = [255, 0, 0]
  30. pix[0][2] = [0, 0, 0]
  31. pix[1][0] = [0, 0, 255]
  32. pix[1][1] = [95, 158, 160]
  33. pix[1][2] = [0, 0, 128]
  34. pix[2][0] = [255, 192, 203]
  35. pix[2][1] = [255, 165, 0]
  36. pix[2][2] = [255, 255, 0]
  37.  
  38. # 配列から画像にする
  39. image = MiniMagick::Image.get_image_from_pixels(pix,
  40. [width, height],
  41. "rgb",
  42. 8,
  43. "png")
  44. # 画像ファイルの書き込み
  45. image.write("output.png")

画像の上下反転

画像ファイル input.png を読み込み、y方向に上下反転して画像ファイル output.png に書き込む。

画像の上下反転

flip_vertical.rb
  1. #!/usr/bin/ruby
  2. # coding: utf-8
  3.  
  4. require "mini_magick"
  5.  
  6. # 画像ファイルの読み込み
  7. image = MiniMagick::Image.open("input.png")
  8.  
  9. # 画像の幅
  10. width = image.width
  11.  
  12. # 画像の高さ
  13. height = image.height
  14.  
  15. # 読み込んだ画像を配列にする
  16. pix1 = image.get_pixels
  17.  
  18. # 書き込む画像用の配列を用意する
  19. pix2 = Array.new(height) { Array.new(width) }
  20.  
  21. # y座標を反転する
  22. (0..(height - 1)).each do |y2|
  23. (0..(width - 1)).each do |x2|
  24. x1 = x2
  25. y1 = height - y2 - 1
  26. pix2[y2][x2] = pix1[y1][x1]
  27. end
  28. end
  29.  
  30. # 配列から画像にする
  31. image = MiniMagick::Image.get_image_from_pixels(pix2,
  32. [width, height],
  33. "rgb",
  34. 8,
  35. "png")
  36.  
  37. # 画像ファイルの書き込み
  38. image.write("output.png")

円の描画

円を描画して画像 output.png に書き込む。

\begin{eqnarray*} x&=&r\cos\phi\\ y&=&r\sin\phi \end{eqnarray*}

\[ ラジアン=角度\times \frac{\pi}{180} \]

この方法は三角関数の説明のためのもので、きれいな円を描画するには他によいアルゴリズムがある。

circle1.rb
  1. #!/usr/bin/ruby
  2. # coding: utf-8
  3.  
  4. require "mini_magick"
  5.  
  6. # 画像の幅
  7. width = 300
  8.  
  9. # 画像の高さ
  10. height = 300
  11.  
  12. # 画像用配列を用意して白で初期化する
  13. pix = Array.new(height) { Array.new(width) { Array.new(3, 255) } }
  14.  
  15. # 円の中心
  16. x0 = width / 2
  17. y0 = height / 2
  18.  
  19. # 円の半径
  20. r = 100
  21.  
  22. # 円の描画
  23. (0..359).each do |i|
  24. # 角度からラジアンに変換
  25. phi = i * Math::PI / 180
  26.  
  27. # (x,y)座標の計算
  28. x = (r * Math.cos(phi)).round + x0
  29. y = (r * Math.sin(phi)).round + y0
  30.  
  31. # 座標のピクセルを塗る
  32. pix[y][x] = [0, 0, 0]
  33. end
  34.  
  35. # 配列から画像にする
  36. image = MiniMagick::Image.get_image_from_pixels(pix,
  37. [width, height],
  38. "rgb",
  39. 8,
  40. "png")
  41. # 画像ファイルの書き込み
  42. image.write("output.png")