10

私はC#を初めて使用し、基本的な画像処理ソフトウェアを実行しようとしています。このスニペットは、WriteableBitmap ピクセル「現在」の ARGB int 値から A、R、G、B を抽出することを理解しています。

for(int i = 0; i < bitmapArray.Length; i++) {
    var current = bitmapArray[i];

    var alpha = (byte)(current >> 24);
    var red = (byte)(current >> 16);
    var green = (byte)(current >> 8);
    var blue = (byte)(current);
    //Some code
 }

値を変換するために ">>" は何をしていますか?

また、r、g、b を個別に計算する場合、それらを整数の ARGB 値に変換して元のピクセルを新しいピクセルに置き換えるにはどうすればよいですか?

前もって感謝します。

編集:ありがとう、今では理にかなっています。

4

3 に答える 3

16

バイナリシフト演算子です。

(a、r、g、b) で定義された色がある場合、バイナリ表現は次のようになります (チャネル深度が 8 ビットであると仮定)。

AAAAAAAA RRRRRRRR GGGGGGGG BBBBBBBB

したがって、全体を 24 か所以上シフトすると、アルファ チャネルが残ります。

AAAAAAAA

16 シフトすると、アルファ チャネルと赤チャネルが得られます。

AAAAAAAARRRRRRRR

これはバイトとしてキャストされるため、最初の 8 ビットのみが抽出されます。

(byte)AAAAAAAARRRRRRRR == RRRRRRRR

16 桁シフトして 11111111 (0xFF) と AND をとることで、赤のチャネルを取得することもできます。

AAAAAAAARRRRRRRR &
0000000011111111
----------------
00000000RRRRRRRR
于 2010-08-15T00:38:38.917 に答える
12

値のビットをcurrent右にシフトしています。この特定のコード スニピットの場合、選択したビットマップ配列要素から色情報の各バイトを個々の色バイトに抽出しているように見えます。

http://msdn.microsoft.com/en-us/library/xt18et0d.aspx

配列に int が含まれていると仮定すると、計算された値を配列要素に戻すには、次のように、ビット シフト プロセスを逆にして、結果を OR で戻します。

int current = (alpha << 24) | (red << 16) | (green << 8) | blue; 
于 2010-08-15T00:26:44.240 に答える
2

<<ロバートの答えに加えて、質問の2番目の部分をカバーするために、 (左シフト)および|(ビットごとのOR)演算子を使用して、個別のコンポーネントを整数に戻すことができます。

int combined = (alpha << 24) | (red << 16) | (green << 8) | blue;
于 2010-08-15T00:38:58.980 に答える