元の画像と比較する画像の赤チャンネルを生成できる特定の関数はありますか?
1 に答える
surface->pixels
でピクセル データにアクセスし、 で画像 Rmask にアクセスできますsurface->format->Rmask
。ビット演算を調べてデータを抽出する
SDL_Surface* t;
//Code
Uint32* pixels = (Uint32*)t->pixels;
int x = 10 ,y = 10; //For pixel at 10, 10
Uint32* MyPixel = pixels + ( (y-1) + t->w ) + x;
Uint32 RedOnly = *MyPixel & t->format->Rmask;
注:ばかげた間違いを犯し、y が y-1 であることを忘れていました。
Uint32* MyPixel = pixels + ( (y-1) + t->w ) + x
次のように動作します:
ピクセルは、Uint32 データの配列の最初の要素を指すポインタです。(32 ビット整数)。ピクセル + 1 を実行すると、Uint32 サイズの 1 バイトのメモリが必要になります。2D 座標系でピクセル 10,10 が必要な場合は、それを 1 次元の線形値に変換する必要があります。SDL_Surface ピクセルは水平で線形であるため、次のようになります。
1,2,3,4,5
6,7,8,9,10
したがって((y-1) * t->w) + x
、線形形式のピクセルの整数値を取得します。たとえば、上記の場合の幅が 5 の場合の 2,2 のピクセルは、((2-1)*5)+2)
どちらがになり7
ます。pixels+7
次に、ピクセルを取得し、配列の原点から 7 int 離れた Uint32 (7*32 ビット) のアドレスである7 ( ) だけオフセットします。
Uint32 RedOnly = *MyPixel & t->format->Rmask
これは次のように機能します: ピクセル (0xFF41A401) のランダムな Uint32 を想定してみましょう。画像フォーマットが ARGB であるとしましょう。つまり、Rmask は 0x00FF0000 です。
バイナリでは、それらは
*MyPixel = 1111 1111 0100 0001 1010 0100 0000 0001
Rmask = 0000 0000 1111 1111 0000 0000 0000 0000
//And a bitwise & operation will result in:
RedOnly = 0000 0000 0100 0001 0000 0000 0000 0000
したがって、赤の値だけが残るので、すべての青/緑の情報を「消去」します。