フルカラー画像を生成
それでは次にRGBのカラー画像を生成してみましょう。カラー画像を扱うのはPPM形式です。
まず、画像のサイズは8×1ドット、最大輝度の段階は256のRGBカラー画像を生成します。
PPMもPBMやPGMと同様に最初に画像形式、情報を示すヘッダーを書きます。最初の一行にはP3の文字を指定します。これがPPM形式である事を示す文字列になります。マジックナンバーの次の行には画像の横幅と縦幅を指定します。横幅と縦幅の間には半角空白を入れます。PGMの場合、横幅と縦幅の次にカラーの最大輝度を指定します。RGB個別に輝度を指定することはできず、RGB全体の最大輝度を指定します。輝度の値はグレースケールの時と同様0から始まります(0が最も暗い)。今回は最大輝度が256段階、つまり0〜255なので255を指定します。
その次の行からRGBカラーの値を数値で記述していきます。RGBカラーなので1ピクセルにつきR(Red:赤)、G(Green:緑)、B(Blue:青)の3つの輝度データが必要になります。輝度は赤、緑、青の順番に指定します。これをピクセルの数だけ指定します。PGMと同様にピクセルデータとピクセルデータの間には空白や改行が必要です。
以下のようにすると8×1ドットのカラー画像になります。
P3
8 1
255
0 0 0
0 0 255
255 0 0
255 0 255
0 255 0
0 255 255
255 255 0
255 255 255
フルカラー画像の場合はデータが多いのでcatコマンドとリダイレクトを使って作成する方が簡単です。
cat >color.ppm
P3
8 1
255
0 0 0
0 0 255
255 0 0
255 0 255
0 255 0
0 255 255
255 255 0
255 255 255
画像をアプリケーションで開いて確認します。横1ドットで「黒、青、赤、紫、緑、水色、黄、白」の順番になっているはずです。もし、なっていなかったら、どこか入力ミスしている可能性があります。確認してみてください。なお、ラズベリーパイでの表示はピクセル間が補間されるためくっきりした境界にはなりません。
画像の形式がわかれば後は簡単です。カラーノイズ画像を生成するには以下のようになります。グレースケールの時は輝度の値だけでしたが、RGBそれぞれの輝度の乱数を出力するようにすればカラーノイズが生成できます。
echo 'P3'>colornoise.ppm
echo '256 256'>> colornoise.ppm
echo '255'>> colornoise.ppm
for i in {1..65536};do echo -n "$(($RANDOM % 256)) $(($RANDOM % 256)) $(($RANDOM % 256)) ";done>> colornoise.ppm
緑だけのノイズにしたければ以下のようにします。
echo 'P3'>colornoise.ppm
echo '256 256'>> colornoise.ppm
echo '255'>> colornoise.ppm
for i in {1..65536};do echo -n "0 $(($RANDOM)) 0 ";done>> colornoise.ppm
ラズベリーパイのアプリケーションで表示すると上図のような画像になってしまいますが、内部的には正しく生成されています。生成されたPPMファイルをmacOSのプレビュー.appで表示すると図のように表示されます。
計算式を利用できるので以下のようにすると下に行くほど明るい緑のノイズ画像を生成することができます。
echo 'P3'> colornoise.ppm
echo '256 256'>> colornoise.ppm
echo '255'>> colornoise.ppm
for i in {1..256};do for j in {1..256};do echo -n "0 $(($RANDOM % $i)) 0 ";done;done>> colornoise.ppm
少ないコマンドとテキストから画像が生成されるのは、なかなか面白いのではないかと思います。今回はピクセル画像を生成しましたが、コマンドラインからテキストでベクトル画像も生成することができます。これについては、また別の機会に。
著者 仲村次郎
いろいろな事に手を出してみたものの結局身につかず、とりあえず目的の事ができればいいんじゃないかみたいな感じで生きております。