printfだけで画像を生成する(.ppm)
2017-02-21
Tech自作のプログラムで画像を出力したいとき、どのフォーマットを選ぶのが良いだろうか。PNGやJPGなどは広く普及したフォーマットだが、マイナーな言語や自作のプログラミング言語の場合、出力するためのライブラリが存在しない場合がある。
そんなときに役立つのが、aobenchでも使われているPPMという画像フォーマットだ。PPMは仕様が極めてシンプルなので、例えばprintfが使えれば出力することができる。
以下はppmファイルの例である(上記ページから拝借)。
P3
3 2
255
255 0 0
0 255 0
0 0 255
255 255 0
255 255 255
0 0 0
Netpbm形式
PPM形式はNetpbm形式とよばれるフォーマットの一種である。Netpbm形式には「白黒・グレースケール・カラー」の3種類に「テキスト・バイナリ」の2種類をかけた6種類が存在し、そのうちのカラーのものがPPM(portable pixmap format)形式なのだ。
上記の例だと、ファイル冒頭の「P3」が「カラー、テキスト」に対応する。
2行目の「3 2」は画像のサイズで、この場合は3x2ピクセルという意味になる。3行目の「255」は、色を0〜255までの256段階で表すという意味。
4行目以降は、左上から順に各ピクセルのR, G, B要素を数値にしたものが並んでいる。ここでは分かりやすく1ピクセルごとに改行してあるが、仕様的にはどこで改行しても構わないようだ。
注意点
R, G, B要素は整数で出力する必要がある。間違って小数で出力してしまった場合、ソフトによっては壊れた画像が表示されたりするので注意が必要だ(エラーにならないので気づきにくい)。