左右反転と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]
© Copyright 2024 ExpyDoc