cub*_*271 22
假设您的十六进制值是一个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;
}
Run Code Online (Sandbox Code Playgroud)
Mat*_*hew 12
RGB值可以通过0xRRGGBB存储为整数.例子:
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;
Run Code Online (Sandbox Code Playgroud)
每个十六进制数字占用4位.因此向右移动16位(将所有4位向右移动)0xRRGGBB成为0xRR.现在你有了红色组件.(如果整数中有一些数据更高,你可以通过屏蔽数据来摆脱它& 0xff.)
如果你正在处理一个字符串"#FFFFFF",那么你首先必须将它转换为一个整数,以使上述工作.
Tor*_*erg 10
如果十六进制代码是一个字符串,您可以像这样解析它
char *str = "0000FF";
int r, g, b;
sscanf(str, "%02x%02x%02x", &r, &g, &b);
Run Code Online (Sandbox Code Playgroud)
这是整数,而不是双打.还要检查sscanf返回3,读取的项目数.
我知道这已经很老了,但我还想提供一个带有联合并且没有任何按位运算的解决方案。
union Color
{
unsigned int hex;
struct { unsigned char b, g, r; };
};
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您可以轻松地从十六进制转换为 RGB,以及从 RGB 转换为十六进制。
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);
Run Code Online (Sandbox Code Playgroud)
输出:
RGB(7, 199, 60), HEX(07c73c)
Run Code Online (Sandbox Code Playgroud)
要映射 0.0 到 1.0 范围内的值,只需将其除以 255.0 :)
编辑: 上面的代码^^仅在Little-Endian CPU架构下受支持,因此更好的方法是检查系统运行在什么字节序上。
然后您可以检查字节顺序来定义结构变量的顺序。
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
};
Run Code Online (Sandbox Code Playgroud)
此代码还支持 RGBA 中的 alpha(透明度)。