====== MiniMagick ====== * [[https://github.com/minimagick/minimagick|MiniMagick]] * [[https://rubydoc.info/github/minimagick/minimagick|API Documentation]] MiniMagick は Ruby で [[https://imagemagick.org/|ImageMagick]] や [[http://www.graphicsmagick.org/|GraphicsMagick]] の画像処理コマンドを使うためのライブラリである。 RMagick に比べてメモリ消費量が少ない。 ===== インストール ===== gem を使って最新バージョンをインストールする。 % gem install mini_magick Ubuntu では以下のパッケージが必要なのでインストールしておく。 * imagemagick * graphicsmagick Ubuntu ではパッケージ ruby-mini-magick があるが、バージョンが古くて機能が足りないかもしれない。 ===== プログラム例 ===== ==== 画像ファイルの読み書き ==== 画像ファイル input.png を読み込み、画像ファイル output.png に書き込む。 #!/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 の間の整数をとる。 * [[https://www.lab-nemoto.jp/www/leaflet_edu/else/ColorMaker.html|RGB確認ツール]] * 配列 pix は3次元配列で、pix[y][x][c] で各要素を指定し、要素の値は R, G, B のどれかの値になる。 * x と y はピクセルの座標。 * c は RGB のいずれかを意味し、R なら 0、G なら 1、B なら 2 を使う。 {{ :ruby:minimagick_pixels.png?nolink |ピクセルの座標と色}} #!/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ピクセルずつ処理する(効率は悪いが例として分かりやすくしている)。 {{ :ruby:minimagick_flip.png?nolink |画像の上下反転}} * 例えば * 水色のピクセルの座標は (0,0) で、上下反転すると (0,height-1) になる。 * 黄色のピクセルの座標は (1,1) で、上下反転すると (1,height-2) になる。 #!/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} \] この方法は三角関数の説明のためのもので、きれいな円を描画するには他によいアルゴリズムがある。 #!/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") ----