2015/3/15前回に引き続き、今回はPNM画像の書き出し処理について説明する。書き出しは、仕様で決められた範囲の自分の都合の良い方法を一つ実装すればよいだけなので、よりシンプルになる。画像の書き出し読み込みと同様に、書き出し関数は、ファイル名を指定するものと、オープン済みのファイルストリームを渡すものを作成する。ファイル名を指定するものはオープン後、ファイルストリームを使うものを呼び出すだけなので、ほぼテンプレートだ。PNMの場合P1~P6のどの形式かを引数で指定できるようにtype引数を用意している。注意点としては出力に失敗した場合でも出力ファイルが作成されてしまう。これが嫌な場合は、失敗時unlinkを呼び出してファイルを削除するようにすればよい。SUCCESS;}前半は出力タイプ別にフォーマットを変換する処理なので割愛する。標準的なフォーマットで3~4つのパラメータをfprintfで出力するだけ。読み込みの苦労に比べれば拍子抜けするほど簡単だ。必要ならばコメントを埋め込んでもいいかもしれない。最大値も余計な変換の必要のない255で出力する。次に、画像データそのものの出力だが、読み込みと同様にタイプ別に関数を分けた。SUCCESS;}テキスト形式のモノクロ画像。01をテキストに変換して出力する。行の終わりか、70文字に達する前に改行するようにした。間にスペースを開けるなどしてもいいし、全部改行でも問題ないだろう。SUCCESS;}テキスト形式のグレースケール画像。0~255の値をそのまま出力すれば良い。デリミタは全部改行にした。スペースにすると70文字で改行の判定が難しいためだ。改行で出力する仕様になっているようだ。SUCCESS;}テキスト形式のフルカラー画像。これもRGBの順で0~255の値をそのまま出力すれば良い。デリミタはRGB間を空白、ピクセル間を改行にした。SUCCESS;}バイナリ形式のモノクロ画像。書き出しでも、これが一番複雑だ。1bitずつ上位ビットから詰め込み、8bit揃えば出力する。行の末尾は1bitでもあれば1byte出力になっている。SUCCESS;}バイナリ形式のグレースケール画像。8bit深度なので特に何も考える必要ない。1byteずつ出力する。SUCCESS;}バイナリ形式のフルカラー画像。これも8bit深度なので、RGBの順で1byteずつ出力すれば良い。以上で、ひと通りのPNM形式出力ができるようになるはずだ。読み込みと比べて、ずいぶんシンプルだったと思う。更新情報2018/07/28lsっぽいコマンドを作る13アップしました。2018/07/13lsっぽいコマンドを作る12アップしました。2017/01/04lsっぽいコマンドを作る11アップしました。2017/01/03lsっぽいコマンドを作る10アップしました。(https://commoncrawl.org/faq/)。