ユーザが指定した画像ファイルを読み込み,そのコピーを別ファイルとして出力する
図1 2週目の目標
図2 テキストエディタで開いたPPMファイルの例
一般的には,ASCIIコード表で文字に変換できる数値(0x00から0x7F,つまり符号なし整数だと0から127)のみが 含まれたファイルはテキストファイルと呼ばれ,テキストエディタで開くと文字列が表示される. 一方,テキストとして表示する用途が想定されていない,ASCIIコード表以外の数値も持つファイルはバイナリファイルと呼ばれる. PPM画像ファイル(P6)は,ヘッダ情報はテキスト形式であるが,画素値はバイナリ形式で保存されるため, バイナリファイルの一種である. 図2にPPMファイルを無理やりテキストエディタで開いた例を示す. ヘッダ部分は意味を成す文字列として表示されるが,画素値の部分はメモリ上に1バイトずつ 画素値の値が記録されているだけで,テキストによる表示は想定されていない. よって,PPMファイルをテキストエディタで開くと,画素値の部分は意味を成す文字列にはならない. つまり,バイナリデータ(本課題ではPPMファイルの画素値)をファイルに読み書きする際は, テキストデータのための関数(fgets,fscanf,fprintfなど)が使えないことになる.
size_t fread(void *buffer, size_t size, size_t count, FILE *fp); 書式なしデータをストリームから読み出す関数.fp から size バイトの項目を count 数まで読み出し,buffer に格納する.戻り値は,実際に読み出した全項目の数. |
size_t fwrite(const void *buffer, size_t size, size_t count, FILE *fp); 書式なしデータをストリームへ書き込む関数.size バイトの項目を count 数だけ buffer から,fp へ書き込む.戻り値は,実際に書き込んだ項目数. |
図3 fread関数の使用例
図4 fwrite関数の使用例
バイナリデータ(書式なしデータ)をファイルに読み書きする関数として,freadとfwriteがある. 使用例を図3, 4に示す. いずれもバイナリファイルをオープンするため,fopenの第二引数に"b"を追加する必要がある. ファイルを開いた後,読み込みではfreadを使用し,ファイルからsizeof(char)(=1バイト)のデータを100個読み込み, bufferに格納している.また,書き込みではfwriteを使用し,bufferの1バイト×100個の要素をファイルに出力している.
PPMファイルから画素値を読み込む処理をiioLoadFile関数に実装せよ. 格納先はIMAGE構造体の1次元静的配列であるpBufferとする. さらに,PPMファイルにpBufferの画素値を書き出す処理をiioSaveFile関数に実装せよ. 実装後,入力画像と同じ画像が出力されるか確認すること.以下は注意点である.
- iioLoadFileとiioSaveFileの両方の実装
- iioSaveFileのファイルopenはwbモードにすること
- ipCopyにおける画素値のコピーの実装
- 実行時,出力ファイル名は.txtではなく.ppmにすること