RubyでPPM出力のメモ

geiinbashoku22009-02-15


Rubyで簡単な画像を作る機会があったのでそのときのメモ。CとかJavaでのPPMファイルの作り方のドキュメントはウェブ上にたくさんあるのでそちらも参考に。PPMについては「http://en.wikipedia.org/wiki/Portable_pixmap」を参照。気づかなかったけど、Windowsでは標準でPPMを開くことはできないみたい。

PPMファイルには以下のようにP1からP6まであるようだ。というか、PPMと呼ぶのはカラーのP3とP6で、P1とP4はPBM、P2とP5はPGMと呼ぶ方が正しいのかもしれない。

P1 白黒2値・アスキー
P2 モノクロ・アスキー
P3 RGBカラー・アスキー
P4 白黒2値・バイナリ
P5 モノクロ・バイナリ
P6 RGBカラー・バイナリ

アスキー形式で出す方が手軽だけど、ファイルサイズは大きくなる。本当はP4形式でことたりたのだけど、Rubyでビット単位で出力する方法がいまいち分からなかったので、P5で出力することにした。

#!/usr/bin/ruby
#p5.rb

width = 256
height = 256

puts "P5"
puts "#{width} #{height}"
puts "255"
  
i=0
while i<height do
  j=0
  while j<width do
    g = (i+j) % 256
    printf("%c",g)
    j+=1
  end
  i+=1
end

標準出力に出力してるので、リダイレクトでこんな感じ。

ruby p5.rb > p5.ppm

ついでにカラーのP6形式。

#!/usr/bin/ruby
#p6.rb

width = 256
height = 256

puts "P6"
puts "#{width} #{height}"
puts "255"
  
i=0
while i<height do
  j=0
  while j<width do
    r = i % 256
    g = j % 256
    b = (i+j) % 256
    printf("%c%c%c",r,g,b)
    j+=1
  end
  i+=1
end