ユーザが指定した画像ファイルを読み込み,減色または上下反転させて別ファイルとして出力する
図1 4週目の目標
プログラムのモジュール化のため,以下の通り別々のファイルで関数等を定義するよう修正せよ.
- main.c
- ヘッダファイルのインクルード
- main関数
- img_io.c,img_io.h
- PIXEL構造体およびIMAGE構造体の定義
- iioLoadFile関数
- iioSaveFile関数
- iioMallocImageBuffer関数
- iioFreeImageBuffer関数
- img_proc.c, img_proc.h
- ipCopy関数
- その他の画像処理関数
ビット演算子とは,整数型の数値 (char, short, int, long) に対してビット単位で演算を行うための演算子である. 整数であればsigned(符号付き)でもunsigned(符号なし)でも適用できる.
C言語で用意されているビット演算子は以下の6つである.
演算子 名称 & ビットごとのAND演算子 ※1
| ビットごとのOR演算子 ※1
^ ビットごとの排他的OR演算子 (XOR)
対応するビットが異なるときには1,同じときには0がセットされる.<< 左シフト
空になる下位ビットには0が入る.>> 右シフト
空になる上位ビットには0が入る.※2
~ 1の補数演算子 (単項演算子)
ビットを反転する.※1論理演算子の && や || とは違う点に注意する.
※2符号付き数の場合,多くの処理系では空になる上位ビットに符号ビットが入る.また,算術演算子(+,-,*,/)と同様に,複合代入演算の形(&=, |=, >>= など)も利用できる.
下の表に具体例を挙げる.ここで,変数A,B,C,Dの型と初期値は以下の通りとする.unsigned char A = 113; (16進 0x71, 2進 0111 0001)
unsigned char B = 15; (16進 0x0F, 2進 0000 1111)
char C = -64; (16進 0xC0, 2進 1100 0000)
char D = 0;
式 結果 (カッコ内は16進表記と10表記) D = A & B A: 0111 0001
B: 0000 1111
D: 0000 0001 (0x01,1) D = A | B A: 0111 0001
B: 0000 1111
D: 0111 1111 (0x7F,127) D = A ^ B A: 0111 0001
B: 0000 1111
D: 0111 1110 (0x7E,126) D = B << 2 B: 0000 1111
D: 0011 1100 (0x3C,60)
2ビット左シフトすると4倍になる D = A >> 3 A: 0111 0001
D: 0000 1110 (0x0E,14)
3ビット右シフトすると8分の1になる D = C >> 3C: 1100 0000
D: 1111 1000 (0xF8,-8)
負の数の右シフトは,空となる上位ビットにシフト前の符号ビット(最上位ビット)が入る
(visual studio, gccで確認) D = ~A A: 0111 0001
D: 1000 1110 (0x8E,-114) A >>= 2複合代入演算の例
A: 0111 0001←式の実行前
A: 0001 1100←式の実行後
入力画像の各画素の下位nビットを0でマスクすることで,減色画像を作成せよ. ただし,nは(自身の学籍番号の下一桁 % 7) + 1 とし,減色処理はipBitMask関数として実装すること.