【问题标题】:Extracting rgb color components from integer value从整数值中提取 rgb 颜色分量
【发布时间】:2010-02-26 14:06:44
【问题描述】:

如果有一个整数值,例如。 86 那么我怎样才能从这个整数值中提取 r,g,b 分量....? 我正在开发 Visual C++ 2008 速成版。 谢谢..

【问题讨论】:

  • 首先在这个整数中的 RGB 分量是如何编码的?
  • 让我解释一下我到目前为止所做的事情......我已经将文件内容读入字节数组,所以现在字节数组的值从 0 到 255,现在我必须显示这些数组图片框控件中的值,所以我使用了位图^ bmp; bmp->SetPixel(i,j,Color::FromArgb( buf[count] ); //buf 是字节数组,但这段代码不显示任何内容,所以我发现如果我提取 rgb 组件并给它们作为 Color::FromArbg(int red,int green,int blue) 中的参数,那么它可能会起作用.. 例如,如果我的值为 86,那么我如何从中获取 rgb 组件..?

标签: visual-c++ graphics colors


【解决方案1】:

通常(我通常会重复,因为您在问题中没有指定太多)颜色被打包在一个带有 RGBA 组件的 4 字节整数中。

你需要做的是mask和shift,例如:

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;

EDIT2:也许你的颜色是用调色板索引的,在这种情况下你应该有一个存储调色板本身的数组,你从文件中读取的字节应该是存储在某处的颜色的索引否则。

【讨论】:

  • 感谢您的出色回答。不透明度是:u8 opacity = color & 0x000000FF
【解决方案2】:

通常您希望使用RGB 宏从三个组件创建颜色。假设您拥有的值采用相同的格式,您可以使用GetRValueGetGValueGetBValue 将其拉回各个部分。

【讨论】:

    猜你喜欢
    • 2014-06-21
    • 2011-02-19
    • 2013-07-03
    • 1970-01-01
    • 2013-06-15
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多