我正在创建一个 WindowsForm 应用程序,它可以获取我的输入 HSB 值并将它们转换为 RGB 值。我在这里改编了 JDB 和 Mohsen 的答案:HSL to RGB color conversion
我的结果代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Drawing;
namespace Colour_Picker
{
public class HSBToRGB
{
public static Color HSBToRGBConversion(float hue, float saturation, float brightness)
{
float red, green, blue;
if(saturation == 0){
red = green = blue = brightness; // achromatic
}else{
var q = brightness < 0.5 ? brightness * (1 + saturation) : brightness + saturation - brightness * saturation;
var p = 2 * brightness - q;
red = hue2rgb(p, q, hue + 1f/3);
green = hue2rgb(p, q, hue);
blue = hue2rgb(p, q, hue - 1f/3);
}
return Color.FromArgb((int)Math.Round(red * 255), (int)Math.Round(green * 255), (int)Math.Round(blue * 255));
}
public static float hue2rgb(float p, float q, float t){
if(t < 0) t += 1;
if(t > 1) t -= 1;
if(t < 1f/6) return p + (q - p) * 6 * t;
if(t < 1f/2) return q;
if(t < 2f/3) return p + (q - p) * (2f/3 - t) * 6;
return p;
}
}
}
它在源代码中提到 HSB 值应该在 [0,1] 的集合中,理想情况下我希望 H 在 [0,360] 的集合中,S 和 B 在 [0,100] 的集合中。我试着弄乱了hue2rgb,但没有用。如何设置我想要的限制?
编辑:感谢 TaW 对我原始代码中的错误的帮助。我实际上将类中的限制保持为 [0, 1] 但在调用该方法之前,我正在根据我想要的限制操作 HSB 值。