using System; using System.Numerics; public static class ColorConvertExtension { /// /// 将RGB颜色转换为HSV颜色空间 /// /// RGB颜色向量,X=R, Y=G, Z=B,取值范围0-1 /// HSV颜色向量,X=H(0-360), Y=S(0-1), Z=V(0-1) public static Vector3 RGBToHSV(this Vector3 rgb) { float r = rgb.X; float g = rgb.Y; float b = rgb.Z; float max = Math.Max(r, Math.Max(g, b)); float min = Math.Min(r, Math.Min(g, b)); float delta = max - min; float h = 0f; float s = 0f; float v = max; // 计算色相 (H) if (delta > 0f) { if (max == r) { h = (g - b) / delta; if (h < 0f) h += 6f; } else if (max == g) { h = 2f + (b - r) / delta; } else // max == b { h = 4f + (r - g) / delta; } h *= 60f; // 转换为度数 } // 计算饱和度 (S) if (max > 0f) { s = delta / max; } return new Vector3(h, s, v); } /// /// 将HSV颜色转换为RGB颜色空间 /// /// HSV颜色向量,X=H(0-360), Y=S(0-1), Z=V(0-1) /// RGB颜色向量,X=R, Y=G, Z=B,取值范围0-1 public static Vector3 HSVToRGB(this Vector3 hsv) { float h = hsv.X; float s = hsv.Y; float v = hsv.Z; // 处理色相超出范围的情况 h = h % 360f; if (h < 0f) h += 360f; // 限制饱和度和明度在0-1范围内 s = Math.Clamp(s, 0f, 1f); v = Math.Clamp(v, 0f, 1f); // 如果饱和度为0,直接返回灰度值 if (s <= 0f) { return new Vector3(v, v, v); } // 将色相转换为0-6的范围 float hNormalized = h / 60f; int sector = (int)hNormalized; float fractional = hNormalized - sector; float p = v * (1f - s); float q = v * (1f - s * fractional); float t = v * (1f - s * (1f - fractional)); return sector switch { 0 => new Vector3(v, t, p), 1 => new Vector3(q, v, p), 2 => new Vector3(p, v, t), 3 => new Vector3(p, q, v), 4 => new Vector3(t, p, v), _ => new Vector3(v, p, q) // 5 或 其他情况 }; } }