在C中从HEX颜色转换为RGB结构

时间:2010-09-16 04:59:50

标签: c colors hex rgb

仅使用C库从纯颜色的HEX代码转换为RGB(没有C ++,模板等)RGB结构可能是这样的 - > typedef struct RGB {double r;双g;双b; } RGB1; 函数应该返回RGB1

5 个答案:

答案 0 :(得分:20)

假设您的十六进制值是一个32位'int'类型,并且我们使用上面描述的RGB结构,那么可能会执行以下操作:

struct RGB colorConverter(int hexValue)
{
  struct RGB rgbColor;
  rgbColor.r = ((hexValue >> 16) & 0xFF) / 255.0;  // Extract the RR byte
  rgbColor.g = ((hexValue >> 8) & 0xFF) / 255.0;   // Extract the GG byte
  rgbColor.b = ((hexValue) & 0xFF) / 255.0;        // Extract the BB byte

  return rgbColor; 
}

答案 1 :(得分:11)

RGB值可以通过0xRRGGBB存储为整数。例子:

  • 红色:0xff0000
  • 绿色:0x00ff00
  • 蓝色:0x0000ff

00为十进制0的十六进制,而ff为255. 0对应0.0和255对1.0。 (实际上你没有指定范围是什么。我假设0.0到1.0。)

因此,通过上述假设,您需要提取每个组件并除以255.由于它听起来很像家庭作业问题,我只会告诉您如何处理红色组件。

int hex = 0x123456;
c.r = ((hex >> 16) & 0xff) / 255.0;

每个十六进制数字占用4位。因此向右移动16位(将所有4位向右移动)使0xRRGGBB变为0xRR。现在你有了红色组件。 (如果整数中有一些数据更高,你可以通过& 0xff屏蔽数据来摆脱它。)

如果您正在处理字符串"#FFFFFF",那么您首先必须将其转换为整数,以便上述工作。

答案 2 :(得分:8)

如果十六进制代码是一个字符串,您可以像这样解析它

char *str = "0000FF";
int r, g, b;
sscanf(str, "%02x%02x%02x", &r, &g, &b);

这是注意力,而不是双打。另外,请检查sscanf是否返回3,即读取的项目数。

答案 3 :(得分:1)

我猜RGB可以在某些系统上存储为0xRRGGBB,但在Windows中它实际上存储为0xBBGGRR(参见http://msdn.microsoft.com/en-us/library/windows/desktop/dd183449)。正如文章所提到的,有GetRValue,GetGValue和GetBValue宏已经可用。

答案 4 :(得分:1)

我知道这已经很老了,但是我也想提供一个带有联合并且没有任何按位运算的解决方案。

union Color
{
    unsigned int hex;
    struct { unsigned char b, g, r; };
};

通过这种方式,您可以轻松地从HEX转换为RGB,以及从RGB转换为HEX。

union Color hex;
hex.hex = 0x07C73C;

union Color rgb;
rgb.r = 7;
rgb.g = 199;
rgb.b = 60;

printf("RGB(%d, %d, %d), HEX(%06x)", hex.r, hex.g, hex.b, rgb.hex);

输出:

RGB(7, 199, 60), HEX(07c73c)

要映射0.0到1.0范围内的值,只需将其除以255.0:)

编辑: 上面的代码^^仅在Little-Endian CPU的体系结构下受支持,因此更好的方法是check what endianness does the system runs on

然后您可以检查字节序以定义结构变量的顺序。

union Color
{
    unsigned int hex;

#if IS_BIG_ENDIAN
    struct { unsigned char a, r, g, b; };
#else
    struct { unsigned char b, g, r, a; };
#endif
};

此代码还支持RGBA中的alpha(透明度)。