Graphics 将颜色分解为其rgb值

Graphics 将颜色分解为其rgb值,graphics,Graphics,我正在用xlib编写一个项目,在颜色方面有一个问题。我使用无符号长类型变量来存储颜色值。有人知道如何获取每种颜色的红、绿和蓝值吗?你是说每个颜色分量的24位颜色8存储在一个32位整数中?如果是这种情况,您可以使用逻辑AND操作将其他位归零来获得值 byte a = (byte)(value >> 24); byte r = (byte)(value >> 16); byte g = (byte)(value >>

我正在用xlib编写一个项目,在颜色方面有一个问题。我使用无符号长类型变量来存储颜色值。有人知道如何获取每种颜色的红、绿和蓝值吗?

你是说每个颜色分量的24位颜色8存储在一个32位整数中?如果是这种情况,您可以使用逻辑AND操作将其他位归零来获得值

        byte a = (byte)(value >> 24);
        byte r = (byte)(value >> 16);
        byte g = (byte)(value >> 8);
        byte b = (byte)value;
假设你从

/*
alpha? r g b
00000000 10101010 10101010 10101010 your 32 bit integer might look like this
& logical AND operator
00000000 00000000 00000000 11111111 a bit mask
=
00000000 00000000 00000000 10101010 the result
so now your 32 bit integer only has the blue values.
To do this in code...
*/
unsigned char B = (unsigned char) (your_integer & 0x000000ff) //000000ff is hex version of the bit mask
//but now what about the other two colors? you can't just apply a bit mask like 0000ff00 because 00000000000000001010101000000000 is much larger than 255.

//So you have to either divide the result by 256 to shift the bits right, or use >>8 to shift them to the right.

unsigned char G = (unsigned char) ((your_integer & 0x0000ff00) / 256)
unsigned char R = (unsigned char) ((your_integer & 0x00ff0000) / 256^2)
//or using the way I've used in the past... shifting before the mask.

unsigned char G = (unsigned char) ((your_integer >> 8) & 0x000000ff)
unsigned char R = (unsigned char) ((your_integer >> 16) & 0x000000ff)

您是说每个颜色分量的24位颜色8存储在一个32位整数中?如果是这种情况,您可以使用逻辑AND操作将其他位归零来获得值

假设你从

/*
alpha? r g b
00000000 10101010 10101010 10101010 your 32 bit integer might look like this
& logical AND operator
00000000 00000000 00000000 11111111 a bit mask
=
00000000 00000000 00000000 10101010 the result
so now your 32 bit integer only has the blue values.
To do this in code...
*/
unsigned char B = (unsigned char) (your_integer & 0x000000ff) //000000ff is hex version of the bit mask
//but now what about the other two colors? you can't just apply a bit mask like 0000ff00 because 00000000000000001010101000000000 is much larger than 255.

//So you have to either divide the result by 256 to shift the bits right, or use >>8 to shift them to the right.

unsigned char G = (unsigned char) ((your_integer & 0x0000ff00) / 256)
unsigned char R = (unsigned char) ((your_integer & 0x00ff0000) / 256^2)
//or using the way I've used in the past... shifting before the mask.

unsigned char G = (unsigned char) ((your_integer >> 8) & 0x000000ff)
unsigned char R = (unsigned char) ((your_integer >> 16) & 0x000000ff)