web-dev-qa-db-ja.com

「&0xff」は何をしますか?

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);
}
39
Lunar

いわゆるマスクです。問題は、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だけシフトする場合も同じです。

45
xs0

& 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)

そのため、単一のカラーチャネルでの単純なピクセルごとのしきい値に基づいた白黒への変換です。

12
Dilum Ranatunga

色表現

RGB値は整数であるため、メモリでは4バイト(または同等の32ビット)で表されます。

例:

00000001 00000010 00000011 00000100

各バイトは、色の1つのコンポーネントを表します。

  • 1バイト目:不透明度に対応するアルファ値(例では00000001)
  • 2バイト目:赤の値(例では00000010)
  • 3番目のバイト:緑の値(例では00000011)
  • 4番目のバイト:青の値(例では00000100)

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);
}
5
Zach

これはおそらく、ARGBとの間で何らかの変換が行われているためです。 これは本当に良いブログ投稿です 色に対してビット単位の操作を行う理由について。

4
Joseph Hansen

& 0xffはビット単位のAND

(image.getRGB(i,j)&0xff)は、getRGBによって返されるrgbエンコードされたintの青の値を取得します。> b部分は、しきい値よりも大きいかどうかをチェックします

0
ratchet freak