====== 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")
----