从整数值中提取rgb颜色分量

4
如果有一个整数值,例如86,那么我怎样从这个整数值中提取出r,g,b分量呢?我正在使用Visual C++ 2008 express版。谢谢。

这个整数中的RGB分量最初是如何编码的? - Timo Geusch
让我解释一下我到目前为止做了什么...
我已经将文件内容读入一个字节数组中,
所以现在字节数组的值从0到255,
现在我需要在picturebox控件中显示这些数组值,
所以我使用了,
Bitmap^ bmp;
bmp->SetPixel(i,j,Color::FromArgb(buf[count]));
//buf是字节数组 但是这段代码没有显示任何东西,
所以我发现如果我提取RGB分量并将它们作为参数传递给Color::FromArbg(int red,int green,int blue),
那么它可能会起作用...
例如,如果我有值86,那么我怎样才能从中获取RGB分量呢..?
- JAYMIN
2个回答

14

通常情况下(我再次强调“通常”,因为您在问题中没有具体说明),颜色是使用RGBA分量打包为4字节整数。

您需要进行掩码和移位操作,例如:

int color = 0xRRGGBBAA;

u8 red = (color & 0xFF000000) >> 24;
u8 green = (color & 0x00FF0000) >> 16;
u8 blue = (color & 0x0000FF00) >> 8;

这假设了我指定的编码方式,但可以根据您的编码方式进行修改。

编辑:在您的示例中,您提到了0-255值。不清楚组件是否为2位大小(每个组件4个强度值)。

在这种情况下,方法仍然相同,但您将只有很少的颜色:

u8 color = 86;

// so you take 2 bits and multiply by 64 to possibly have intensities: 0, 64, 128, 192
u8 red = ((color & 0xC0) >> 6) * 64; 
u8 green = ((color & 0x30) >> 4) * 64;
u8 blue = ((color & 0x0C) >> 2) * 64;

编辑2: 也许您的颜色是按调色板索引的,则您应该有一个存储调色板本身的数组,而文件中读取的字节应该是存储在其他地方的颜色索引。


感谢您提供的出色答案。不透明度将是:u8 opacity = color&0x000000FF。 - wcandillon

0

通常你想要使用 RGB 宏从三个组件创建一个颜色。假设你拥有的值是相同格式的,你可以使用 GetRValueGetGValueGetBValue 将其分解为各个部分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接