如何在 C/C++ 中将 RGB 转换为 HSL?
(Note: This is a (short) self-answer -- I posted it here so people can find it quickly with a search.)
翻译代码来自here http://axonflux.com/handy-rgb-to-hsl-and-rgb-to-hsv-color-model-c, 你得到:
// Assuming sizeof(unsigned int) == 4 * sizeof(unsigned char)
unsigned int RgbToHsl(unsigned int rgb) // Alpha value is simply passed through
{
#ifdef __cplusplus
using std::max;
using std::min;
#endif
double
r = (rgb >> (0 * CHAR_BIT)) & UCHAR_MAX,
g = (rgb >> (1 * CHAR_BIT)) & UCHAR_MAX,
b = (rgb >> (2 * CHAR_BIT)) & UCHAR_MAX;
r /= UCHAR_MAX;
g /= UCHAR_MAX;
b /= UCHAR_MAX;
double
maxv = max(max(r, g), b),
minv = min(min(r, g), b),
h = 0, s = 0, d = maxv - minv,
l = (maxv + minv) / 2;
if (maxv != minv)
{
s = l > 0.5 ? d / (2 - maxv - minv) : d / (maxv + minv);
if (maxv == r) { h = (g - b) / d + (g < b ? 6 : 0); }
else if (maxv == g) { h = (b - r) / d + 2; }
else if (maxv == b) { h = (r - g) / d + 4; }
h /= 6;
}
return ((unsigned int)(h * UCHAR_MAX) << (0 * CHAR_BIT)) |
((unsigned int)(s * UCHAR_MAX) << (1 * CHAR_BIT)) |
((unsigned int)(l * UCHAR_MAX) << (2 * CHAR_BIT)) |
(((rgb >> (3 * CHAR_BIT)) & UCHAR_MAX) << (3 * CHAR_BIT));
}
假设顺序为 RGBA,其中 R 是最低有效字节。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)