ruby-robotの夢

cygwin-ruby,qgisの達人を目指す奮闘記

Rmagickで2次元配列から画像生成

2次元配列の画像生成は基本では?

2次元配列から画像にするのは、ごく基本的な画像処理作業である。

ところが、Rmagickでどうするか?日本語の説明文が出てこない。

rmagickのTextから変換する等、カッタるい方法の紹介はあるのに。

私自身も、これまでrmagickを用いず、bmpの生成、rmagickで変換というカッタるいことをしていた。

rmagickに機能が無いわけはない。英語の説明は充実しており、調べてみよう。

配列から画像の直接のメソッドは?

調べてみたが、配列から画像に変換するようなメソッドは見当たらない?(rmagick4.0.0)

でも、ピクセル単位で変換は、 img.pixel_color(x,y,colors)でできるようだ。

サンプルコード

f:id:george_thai:20200529010900p:plain

例えば、下記のような配列状のテキストデータから画像に変換しようと思えば、

000000000000000000000000000000000000344444444322222344444444444444444444
000000000000000000000000000000000000344444444433222233444444444444444444
000000000000000000000000000000000000344444444444322222344444444444444444
000000000000000000000000000000000000344444444444322222344444444444444444
000000000000000000000000000000222333333444444444422222234444444444444444
000000000000000000000000000000222333333444444444422222234444444444444444
000000000000000000000000000002222233333444444444433222224444444444444444
000000000000000000000000000002222233333444444444444211123344444444444444
000000000000000000000000000002222233333444444444444211123344444444444444
000000000000000000000000000002222233333444444444444222112223344444444444
000000000000000000000000000002222333333444444444444000000012234444444444
000000000000000000000000000002333333344444444444444000000002234444444444
000000000000000000000000000002333333344444444444444000000002234444444444
000000000000000000000000000002333333344444444444444000000002244444444444
000000000000000000000000000002333344444444444444444000000000034444444444
000000000000000000000000000003334444433344444444433000000000024444444444

次のようなコードで画像生成できる。

 

require "rmagick"
nfi=ARGV[0]
nfo=nfi.sub(/\.txt$/,".png")
hs=IO.readlines(nfi)
ni=hs.size;nj=hs.map{|l| l.size}.max
unit=50*2**8
colors=[0,1,2,3,4,5].map{|i| Magick::Pixel.new(i*unit,i*unit,i*unit,0)}
img=Magick::Image.new(nj,ni)
ni.times{|i| nj.times{|j| img.pixel_color(j,i,colors[h=hs[i][j].to_i]) } }
img.write(nfo)

それほど早くはないが、おそらく、テキストから変換するconvertよりは早いだろう。