如何在C语言中将RGB转换为HSL?

4

如何在C/C++中将RGB转换为HSL?

(注意:这是一个简短的自我回答-我在这里发布它,以便人们可以通过搜索快速找到它。)

1个回答

4

这里翻译代码,你得到:

// 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是最不重要的字节。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接