[ [[高橋のページ:http://tortoise1.math.ryukoku.ac.jp/~takataka/index-j.html]] ]
[ [[プログラミングおよび実習II]] ]
*プログラミングおよび実習II 2005年10月27日
#contents
**今日の課題: 画像を読み書き・加工するプログラムを作ろう
サンプル画像: [[uni3ascii.pgm>http://tortoise1.math.ryukoku.ac.jp/~takataka/course2005/prog2/gakunai/uni3ascii.pgm]] [[uni3kowai.pgm>http://tortoise1.math.ryukoku.ac.jp/~takataka/course2005/prog2/gakunai/uni3kowai.pgm]] (学内からしかアクセスできません)
ブラウザを使って自分の prog2 ディレクトリ内に保存しましょう.
***課題1027-A (締切:10月27日,延長不可)
10月26日の演習問題を提出しチェックを受けて下さい.
***課題1027-B (締切:10月27日,締切延長権を使うと11月10日まで)
以下の二つをまとめてチェックします.
<プログラム image1.c>
+PGM画像を二次元配列に読み込む
+講義で説明した関数 Negate() で画素値を反転
+PGM画像として出力
<プログラム image2.c>
+PGM画像を二次元配列に読み込む
+演習問題で作成した関数 FlipHorizontal() で画像の左右を反転
+PGM画像として出力
&aname(pipe);
***課題1027-C (締切:10月27日,1027-Bを10月27日に提出した人のみ対象のボーナス課題,延長不可)
'<'や'>'を使って標準入力や標準出力をリダイレクトすると,キー入力や画面への出力の代わりにファイルを使って入出力できました.同じように,'|'(パイプといいます)を使うと,二つのプログラムの標準出力と標準入力をつなぐことができます.例えば,
$ ./image1 < uni3ascii.pgm | ./image2 > hoge.pgm
とすると,次のように画素反転と左右反転を一度に行うことができます.
+image1 が uni3ascii.pgm を読み込み,画素反転したものをパイプ経由で出力
+image2 はそれをパイプ経由で受け取り,左右反転して hoge.pgm に出力~
では,サンプル画像の uni3kowai.pgm を入力として,
$ ./image1 < uni3kowai.pgm | ./imge2 | ./image3 > hoge.pgm
と実行すると hoge.pgm が uni3ascii.pgm と同じ画像になるようなプログラム image3.c を作りましょう.
**おまけ
***いろんな画像を加工してみたいという人は
実習室のLinux環境では,Netpbmという画像変換・処理ツール群が使えます.
例えばhoge.jpgという名前のJPEG画像が手元にあるとしたら,
% jpegtopnm < hoge.jpg > hoge.ppm
とすると,PPM(バイナリ形式)の画像ファイル hoge.ppm が作成されます.次に,
% ppmtopgm -plain < hoge.ppm > hoge.pgm
とすると,PGM(アスキー形式)の画像ファイル hoge.pgm が作成されます.もちろん,二つのコマンドをパイプでつないで
% jpegtopnm < hoge.jpg | ppmtopgm -plain > hoge.pgm
としても構わないですね.
この hoge.pgm を自分の作ったプログラムに入力して遊んでみるとよいでせう.
ちなみに,上記の -plain というのは,ppmtopgmが出力するPGM画像をバイナリ形式
ではなくアスキー形式にするためのオプションです.jpegtopnmにこのオプションをつけて
% jpegtopnm -plain < hoge.jpg > hoge.ppm
とすれば,hoge.ppm はアスキー形式のPPM画像になります.この画像形式を解読してカラー画像をいじって遊ぶとさらに楽しいかも.
ところで,PNMの画像フォーマットでは,ヘッダに#ではじまるコメント行を入れることが許されています.画像変換や処理のソフトウェアによってはコメントをつけて出力するものもありますので,そういった画像も自分のプログラムで扱うためには,エディタで一度開いてコメント行を削除する,あるいは,コメント行を読み飛ばせるように自分のプログラムを改造する,という作業が必要になります.
**ポインタについて復習しよう
こちらをどうぞ: 「[[ポインタの話>http://tortoise1.math.ryukoku.ac.jp/~takataka/course2004/doc/pointer/]]」