-2
public void Only_GREEN() 
{

    for(int y=0;y<bi.getHeight();y++)
    {

        for(int x=0;x<bi.getWidth();x++)
        {

            int rgb = bi.getRGB(x, y);
            Color c = new Color(rgb);

            int r=c.getGreen();

            rgb = (0xff000000) | (0 << 16) | (r << 8) | (0 << 0);
            System.out.println("hi",rgb);
            bi.setRGB(x, y, rgb);

        }

    }

}

これは、画像を緑色にペイントするためのコードです。次の 2 行が理解できません。

int r=c.getGrenn()
rgb = (0xff000000) | (0 << 16) | (r << 8) | (0 << 0);

彼らは何をしますか?

4

2 に答える 2

2

a = 0xf000と仮定しましょうb = 0x000f

x | yビットごとの orです。x結果の出力では、 、y、または両方のすべてのビットが に設定さ1れます。a | bになり0xf00fます。b | bになり0x000fます。

x << num左シフトです。すべてのビットが左xにシフトされます。num左側にシフトアウトされた値は失われ、右側の新しい値はゼロになります。b << 40x00f0なりa << 4ます0x0000

それでは、選択したコードを分解してみましょう。最初の部分は、緑の値を int (ビット表現を持つ) として取得しているように見えます。2 番目の部分はより興味深いものです。

// Start
rgb = (0xff000000) | (0 << 16) | (r << 8) | (0 << 0);

// 1. Do the parts in parentheses. Notice the green value was shifted over two bits
rgb = 0xff000000 | 0x00000000 | 0x0000rr00 | 0x00000000;

// 2. Apply the ORs
rgb = 0xff00rr00;

それで、何が起こっているのですか?これはアルファ (最初の 2 バイト) をすべて 1 に設定するように見えるので、色は不透明になります。次に、赤 (2 番目の 2 バイト) と青 (最後の 2 バイト) をゼロにします。緑の色を保持し、RGB 表現の緑の部分にビット シフトします。これが機能するのは、RGB 16 進表現が のよう0xAARRGGBBになるためです。ここで、A はアルファ、R は赤、G は緑、B は青です。

于 2013-06-25T12:42:36.693 に答える
1

getGreen() 関数は、色の緑の部分の値を返します。

多くの場合、色は 6 文字の 16 進コードで表されます。最初の 2 文字は赤、次の 2 文字は緑、最後の 2 文字は青です。

(r<<8)2 つの緑色の文字を 2 つの文字にわたってシフトするため、標準の 16 進カラー コードに適合します。2 つの 16 進文字は 8 ビット長であるため、緑色の値を正しいスペースに配置するために、8 だけ左にシフトされます。

于 2013-06-25T12:36:29.873 に答える