b
が指定された整数で、image
が画像である以下のコードを理解しようとしています。
与えられたポイントi、jのRGB値がbより大きい場合、そのピクセルを白に設定し、そうでなければ黒に設定することを理解しています。画像を白黒に変換します。
しかし、私は(&0xff)が実際に何をするのか迷っていますが、その種類のバイナリシフトを推測していますか?
if ((image.getRGB(i, j) & 0xff) > b) {
image.setRGB(i, j, 0xffffff) ;
} else {
image.setRGB(i, j, 0x000000);
}
いわゆるマスクです。問題は、RGB値をすべて1つの整数で取得し、各コンポーネントに1バイトを使用することです。 0xAARRGGBB(アルファ、赤、緑、青)のようなもの。ビット単位で0xFFを実行すると、最後の部分(青)だけが保持されます。他のチャネルでは、次を使用します。
int alpha = (rgb >>> 24) & 0xFF;
int red = (rgb >>> 16) & 0xFF;
int green = (rgb >>> 8) & 0xFF;
int blue = (rgb >>> 0) & 0xFF;
アルファの場合、& 0xFF
はスキップできます。何もしないためです。青い場合に0だけシフトする場合も同じです。
の
& 0xFF
色成分の1つを取得しています(赤または青のいずれか、どちらを忘れるか)。
カラーマスクが実行されない場合、RGB(0、127、0)としきい値63を考慮してください。getRGB(...)呼び出しは
(0 * 256 * 256) + (127 * 256) + 0 = 32512
これは明らかにしきい値63を超えています。しかし、その目的は他の2つのカラーチャネルを無視することでした。ビットマスクは、0の最下位8ビットのみを取得します。
の
> b
色が特定のしきい値「b」よりも明るいかどうかを確認しています。
しきい値を超えると、ピクセルは白で表示されます。
image.setRGB(i,j,0xffffff)
...それ以外の場合、それは黒を使用して、を使用して
image.setRGB(i,j,0x000000)
そのため、単一のカラーチャネルでの単純なピクセルごとのしきい値に基づいた白黒への変換です。
色表現
RGB値は整数であるため、メモリでは4バイト(または同等の32ビット)で表されます。
例:
00000001 00000010 00000011 00000100
各バイトは、色の1つのコンポーネントを表します。
xffおよび0xffffffシンボル
0xffは、整数255に等しい16進値FFを表します。そのバイナリ表現は次のとおりです。
00000000 00000000 00000000 11111111
同様に、0xffffffは次のように表されます。
00000000 11111111 11111111 11111111
これは、白色(赤、緑、青が255に等しい)に対応しています。
&演算子
二項演算子と「&」は、2つの整数i1およびi2(i1およびi2)に適用されます。 i1とi2の両方で1に等しいビットを除き、すべてのビットが0に等しい整数を返します。たとえば、最初の例と0xffに&を適用すると、次のようになります。
00000000 00000000 00000000 00000100
結果として、(&0xff)は、最後のバイトの値(つまり、色の青の成分の値)のみを保持できるようにします。
// If the blue component of image.getRGB(i, j) is greater than b
if ((image.getRGB(i, j) & 0xff) > b) {
// Set the image to white
image.setRGB(i, j, 0xffffff) ;
} else {
// Set the image to black
image.setRGB(i, j, 0x000000);
}
これはおそらく、ARGBとの間で何らかの変換が行われているためです。 これは本当に良いブログ投稿です 色に対してビット単位の操作を行う理由について。
& 0xff
はビット単位のAND
(image.getRGB(i,j)&0xff)
は、getRGB
によって返されるrgbエンコードされたintの青の値を取得します。> b
部分は、しきい値よりも大きいかどうかをチェックします