hsl转rgb c语言
时间: 2024-11-05 07:27:23 浏览: 25
HSL(色相、饱和度、亮度)颜色模型是一种不同于RGB(红绿蓝)的色彩表示方式。在C语言中,将HSL转换为RGB涉及到一些数学计算。以下是基本步骤:
1. **色相(Hue)**:保持不变,因为HSL和RGB都基于0到360的圆周角度。
2. **饱和度(Saturation)**:如果饱和度为0,那么颜色将是灰色,HSL值不影响RGB值;若饱和度不为0,需要找到相应的等百分比点。
3. **亮度(Lightness)**:首先根据亮度调整红色、绿色和蓝色分量,范围从0(完全黑色)到1(纯白色)。然后根据饱和度和亮度计算出新的R、G、B值。
4. **转换公式**:
- 如果饱和度 `s` 为0,则直接用亮度作为RGB值;
- 否则,找到最大和最小三原色通道(假设为`max_c`和`min_c`),并计算中间值`mid_c = (brightness + min_c) / 2`;
- 对于中间通道:`new_mid = mid_c`
- 对于最小通道:`new_min = max(0, mid_c - s * abs(max_c - mid_c))`
- 最终的RGB值分别是 `(new_max, new_mid, new_min)` 或 `(new_red, new_green, new_blue)`。
```c
#include <stdio.h>
#include <math.h>
void hsl_to_rgb(float hue, float saturation, float lightness, float* r, float* g, float* b) {
if (saturation == 0) { // gray color
*r = *g = *b = lightness;
} else {
float max_c, min_c, mid_c;
max_c = max(*r, max(*g, *b));
min_c = min(*r, min(*g, *b));
mid_c = (lightness + min_c) / 2;
*r = hue_to_rgb(hue, max_c - min_c, lightness, &mid_c);
*g = hue_to_rgb(hue, max_c - min_c, mid_c, NULL);
*b = hue_to_rgb(hue, max_c - min_c, min_c, NULL);
}
}
// Helper function to calculate a single RGB channel for hue
float hue_to_rgb(float hue, float delta, float lightness, float* mid) {
if (hue <= 0.666f) {
return lightness + delta * hue;
} else if (hue <= 0.833f) {
*mid = lightness;
return lightness + delta * (0.833f - 0.833f);
return lightness;
}
}
int main() {
float hue = 0.5; // 示例色相
float sat = 0.7; // 示例饱和度
float lum = 0.5; // 示例亮度
float r, g, b;
hsl_to_rgb(hue, sat, lum, &r, &g, &b);
printf("RGB values: (%.2f, %.2f, %.2f)\n", r, g, b);
return 0;
}
```
阅读全文