osg 中 osg::Vec4f 的 hsla 转换成 rgba 颜色,写一段代码
时间: 2024-01-21 20:17:18 浏览: 140
16进制和rgba颜色的相互转换
4星 · 用户满意度95%
以下是将 osg::Vec4f 类型的颜色从 hsla 转换为 rgba 的代码示例:
```cpp
osg::Vec4f hslaColor(0.3f, 0.5f, 0.8f, 1.0f); // 定义 hsla 颜色
float h = hslaColor.x() * 360.0f; // 提取 hue 值并转换为角度
float s = hslaColor.y();
float l = hslaColor.z();
float a = hslaColor.w();
float c = (1.0f - std::abs(2.0f * l - 1.0f)) * s; // 计算 chroma 值
float x = c * (1.0f - std::abs(std::fmod(h / 60.0f, 2.0f) - 1.0f)); // 计算 x 值
float m = l - c / 2.0f; // 计算 m 值
float r, g, b;
if (h < 60.0f) {
r = c;
g = x;
b = 0.0f;
} else if (h < 120.0f) {
r = x;
g = c;
b = 0.0f;
} else if (h < 180.0f) {
r = 0.0f;
g = c;
b = x;
} else if (h < 240.0f) {
r = 0.0f;
g = x;
b = c;
} else if (h < 300.0f) {
r = x;
g = 0.0f;
b = c;
} else {
r = c;
g = 0.0f;
b = x;
}
// 转换为 0-255 范围内的整数
int red = static_cast<int>((r + m) * 255.0f);
int green = static_cast<int>((g + m) * 255.0f);
int blue = static_cast<int>((b + m) * 255.0f);
int alpha = static_cast<int>(a * 255.0f);
osg::Vec4f rgbaColor(red / 255.0f, green / 255.0f, blue / 255.0f, alpha / 255.0f); // 构造 rgba 颜色
```
其中,hslaColor 表示输入的 hsla 颜色,h、s、l 和 a 分别表示 hue、saturation、lightness 和 alpha 值。我们首先将 hue 值转换为角度,然后根据公式计算 chroma 值、x 值和 m 值,接着根据 hue 值将 r、g、b 值赋值。最后,将 r、g、b 和 a 值转换为 0-255 范围内的整数,并构造成 osg::Vec4f 类型的 rgba 颜色返回即可。
阅读全文