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

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

假设您的hex值是一个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; } 

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

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

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

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

 int hex = 0x123456; cr = ((hex >> 16) & 0xff) / 255.0; 

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

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

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

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

这是整数,而不是双打。 还要检查sscanf返回3,读取的项目数。

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