我基本上是画一条代表水流的线。我想通过将水的颜色从100%蓝色着色为100%红色来为用户提供近似的水温。 我虽然这很简单,我只用了2分钟就完成了。 两个小时后,我需要的是非常简单的东西,我正在研究一种非常高级的色彩系统。
我正在制作WinForm并使用System.Draw和笔:
Pen Pen1 = new Pen(Color.FromArgb(0, 0, 0, 0), 2);
我希望使用输入(Double)从-1到1的函数,并且输出Color
类似
Public Color TemperatureRange(double BlueToRed)
{
Color MyColor = new Color();
byte a, r, g, b;
//Insert math function that take from -1 to 1 and
//produces and argb-output ranging from blue to red
MyColor = Color.FromArgb(a, r, g, b);
return MyColor;
}
答案 0 :(得分:1)
这是一种简单的线性RGB缩放方法:
public Color TemperatureRange(double value)
{
// start = blue = #0000FF
// end = red = #FF0000
// range [-1; 1]
var r = (int)(0xff * (value + 1) / 2);
var g = 0;
var b = (int)(0xff * (1 - value) / 2);
return Color.FromArgb(r, g, b);
}
在中间它会产生Color.Purple
(#800080)。
“更正确”的版本应处理HSL。您将需要转换方法,我用过this class,然后可能是这样的:
public Color TemperatureRange(double value)
{
if (value < 0)
{
// blue range
var max = new ColorRGB(Color.Blue);
var color = ColorRGB.FromHSL(max.H, max.S * (-value), max.L);
return Color.FromArgb(color.R, color.G, color.B);
}
else
{
// red range
var max = new ColorRGB(Color.Red);
var color = ColorRGB.FromHSL(max.H, max.S * value, max.L);
return Color.FromArgb(color.R, color.G, color.B);
}
}
在中间会产生某种灰色(演示是由ScreenToGif制作的):
答案 1 :(得分:1)
如果您希望中间颜色为绿色,请尝试此操作。
public static Color TemperatureRange(double BlueToRed)
{
double r, g, b;
// blue to cyan
if (BlueToRed < -0.5)
{
r = 0;
g = 2 + BlueToRed * 2;
b = 1;
}
// cyan to green
else if (BlueToRed < 0)
{
r = 0;
g = 1;
b = -BlueToRed * 2;
}
// green to yellow
else if (BlueToRed < 0.5)
{
r = BlueToRed * 2;
g = 1;
b = 0;
}
// yellow to red
else
{
r = 1;
g = 2 - BlueToRed * 2;
b = 0;
}
return Color.FromArgb((int)(r * 255), (int)(g * 255), (int)(b * 255));
}