C语言版: - void HSLtoRGB(float h, float s, float l, int* r, int* g, int* b) {
if (s == 0) { // 灰色阶段 *r = *g = *b = l * 255; } else { float q = l < 0.5 ? l * (1 + s) : l + s - l * s; float p = 2 * l - q; float hk = h / 360.0;
float tr = hk + 1.0 / 3.0; float tg = hk; float tb = hk - 1.0 / 3.0;
// 确保值在0到1之间 if (tr < 0) tr += 1; if (tr > 1) tr -= 1; if (tg < 0) tg += 1; if (tg > 1) tg -= 1; if (tb < 0) tb += 1; if (tb > 1) tb -= 1;
// 计算红、绿、蓝分量 *r = tr < 1.0/6.0 ? p + (q - p) * 6 * tr : tr < 1.0/2.0 ? q : tr < 2.0/3.0 ? p + (q - p) * 6 * (2.0/3.0 - tr) : p; *g = tg < 1.0/6.0 ? p + (q - p) * 6 * tg : tg < 1.0/2.0 ? q : tg < 2.0/3.0 ? p + (q - p) * 6 * (2.0/3.0 - tg) : p; *b = tb < 1.0/6.0 ? p + (q - p) * 6 * tb : tb < 1.0/2.0 ? q : tb < 2.0/3.0 ? p + (q - p) * 6 * (2.0/3.0 - tb) : p;
// 缩放到0到255之间 *r *= 255; *g *= 255; *b *= 255; } }
QT版: - #include <QColor>
QColor hslToRgb(int h, int s, int l) { qreal hue = h / 360.0; qreal saturation = s / 100.0; qreal lightness = l / 100.0;
if (saturation == 0) { int value = lightness * 255; return QColor(value, value, value); }
qreal q = lightness < 0.5 ? lightness * (1 + saturation) : lightness + saturation - lightness * saturation; qreal p = 2 * lightness - q;
qreal r = hueToRgb(p, q, hue + 1.0/3.0); qreal g = hueToRgb(p, q, hue); qreal b = hueToRgb(p, q, hue - 1.0/3.0);
int red = r * 255; int green = g * 255; int blue = b * 255;
return QColor(red, green, blue); }
qreal hueToRgb(qreal p, qreal q, qreal t) { if (t < 0) t += 1; if (t > 1) t -= 1; if (t < 1.0/6.0) return p + (q - p) * 6 * t; if (t < 1.0/2.0) return q; if (t < 2.0/3.0) return p + (q - p) * (2.0/3.0 - t) * 6; return p; }
|