Document

左右反転と180度回転
[0][0]
[0][xsize – 1]
→ i
↓
j
[ysize – 1][xsize – 1]
ビットシフトとビット反転
例
1ビット右シフト 11101100 → 01110110
ビット反転
11101100 → 00010011
RGBそれぞれを処理することを忘れないこと

ビットシフト
ビット反転
モノクローム画像化

例
R 100
G 150
B 125
平均値
125
R 125
G 125
B 125
縮小と拡大

例
10 30 50 12 31 50
½に縮小
11 31 50
11 31 45 11 32 55
10 30 50 10 30 50 12 31 50 12 31 50
10 30 50 10 30 50 12 31 50 12 31 50
11 31 45 11 31 45 11 32 55 11 32 55
11 31 45 11 31 45 11 32 55 11 32 55
モザイク化
モザイク

例:2×2画素の平均値で置きかえる
10 30 50 12 31 50
11 31 45 11 32 55
モザイク
11 31 50 11 31 50
11 31 50 11 31 50
※ブロックを大きくするほど粗い画像になる
~ポインタの復習(再掲)~
ポインタ型変数宣言の例
int n;
int *ptr; ← ptrは int型の変数を指すポインタ変数
n = 50;
ptr = &n; ← ptrに n のアドレスを代入
アドレス演算子(単項&演算子, &operator)
データが格納されているアドレスを返す演算子
ptr
104番地
n
104番地 :
50
間接演算子
int n;
int *ptr;
n = 50;
ptr = &n;
*ptr = 70;
この“*”は間接演算子(indirect operator)
ptrが指している変数の中身が70に書き換えられる.
ptr
80番地 : 104番地
n
104番地 :
50
70
PIXEL構造体
typedef struct{
unsigned char
unsigned char
unsigned char
} PIXEL, *PPIXEL;
r;
g;
b;
int main(void){ //例
PIXEL x;
PPIXEL px = &x;
...
}
?番地 px
200番地 x
200番地
r
g
b
88
B1
E7
アロー演算子 ->
pxが指しているPIXEL構造体のrの値を変えたい
(*px).r = 5; 正しい
px -> r = 5
この“*”は間接演算子
ポインタ変数の宣言と混同しない!
*px.r = 5; 正しくない
(*(px.r) = 5と解釈される)
px
5
x r
g
b
88
B1
E7
各データの参照方法(1)
void ipRotateImage(IMAGE *pImage);
pImage->xsize
pImage
xsize 256
ysize 192
level 255
pBuffer
この行の先頭アドレスは
pImage->pBuffer[0]
→ i
pBuffer[0]
pBuffer[1]
このポインタの配列の
先頭アドレスは
pImage->pBuffer
↓
j
各データの参照方法(2)
この1画素は
pImage->pBuffer[1][3]
IMAGE *pImage
pImage
この1画素のR成分は
pImage->pBuffer[1][3].r
xsize 256
ysize 192
level 255
pBuffer
構造体の
メンバ参照演算子
→ i
pBuffer[0]
pBuffer[1]
↓
j
pBuffer[ysize-1]
参考
データ構造がこうなっているとき
R成分の値を参照するには…
pImage->pBuffer[0][0]->r
IMAGE *pImage
pImage
違いを味わって欲しい…
xsize 256
ysize 192
level 255
pBuffer
→ i
pBuffer[0]
pBuffer[1]
↓
j
pBuffer[ysize-1]