根据值获取渐变内的颜色值
Get a color value within a gradient based on a value
假设我有以下梯度:
- 开始 (0):绿色 (0, 255, 0)
- 中心 (0.5):橙色 (255, 165, 0)
- 结束 (1):红色 (255, 0, 0)
现在是否有计算或现有函数可以根据每秒变化的值从该渐变中读取颜色值?
作为我的一个想法:一个人可以,例如在 Photoshop 中,创建一个图像,比如说 100px 宽和 1px 高。现在我用上面提到的值和点在整个表面上放置一个颜色渐变。我想要获取颜色的值也仅在 int 值 0 和 100 之间。因此我可以将此图像加载到一个变量左右(不在 UI 中显示它)并获取颜色基于我的 "GetPixel" 函数的值,所以如果例如值为 50,我会得到橙色,因为图像中的第 50 个像素对应于橙色。这将是一种合理且(理论上)易于编程的可能性。
但现在这个值每秒都在变化。而且我想我在某处读到 GetPixel 函数相对较慢。当然我现在就可以把它编程出来(出于测试目的我可能会在之后做),但在我看来它非常耗费资源。有更好的选择吗?
这里是 RGB space 颜色之间的简单线性插值,使用 System.Drawing.Color
来保持颜色:
public int LinearInterp(int start, int end, double percentage) => start + (int)Math.Round(percentage * (end - start));
public Color ColorInterp(Color start, Color end, double percentage) =>
Color.FromArgb(LinearInterp(start.A, end.A, percentage),
LinearInterp(start.R, end.R, percentage),
LinearInterp(start.G, end.G, percentage),
LinearInterp(start.B, end.B, percentage));
public Color GradientPick(double percentage, Color Start, Color Center, Color End) {
if (percentage < 0.5)
return ColorInterp(Start, Center, percentage / 0.5);
else if (percentage == 0.5)
return Center;
else
return ColorInterp(Center, End, (percentage - 0.5)/0.5);
}
你会像这样使用它:
var Start = Color.FromArgb(255, 0, 255, 0);
var Center = Color.FromArgb(255, 255, 165, 0);
var End = Color.FromArgb(255, 255, 0, 0);
var Pick = GradientPick(0.75, Start, Center, End);
假设我有以下梯度:
- 开始 (0):绿色 (0, 255, 0)
- 中心 (0.5):橙色 (255, 165, 0)
- 结束 (1):红色 (255, 0, 0)
现在是否有计算或现有函数可以根据每秒变化的值从该渐变中读取颜色值?
作为我的一个想法:一个人可以,例如在 Photoshop 中,创建一个图像,比如说 100px 宽和 1px 高。现在我用上面提到的值和点在整个表面上放置一个颜色渐变。我想要获取颜色的值也仅在 int 值 0 和 100 之间。因此我可以将此图像加载到一个变量左右(不在 UI 中显示它)并获取颜色基于我的 "GetPixel" 函数的值,所以如果例如值为 50,我会得到橙色,因为图像中的第 50 个像素对应于橙色。这将是一种合理且(理论上)易于编程的可能性。
但现在这个值每秒都在变化。而且我想我在某处读到 GetPixel 函数相对较慢。当然我现在就可以把它编程出来(出于测试目的我可能会在之后做),但在我看来它非常耗费资源。有更好的选择吗?
这里是 RGB space 颜色之间的简单线性插值,使用 System.Drawing.Color
来保持颜色:
public int LinearInterp(int start, int end, double percentage) => start + (int)Math.Round(percentage * (end - start));
public Color ColorInterp(Color start, Color end, double percentage) =>
Color.FromArgb(LinearInterp(start.A, end.A, percentage),
LinearInterp(start.R, end.R, percentage),
LinearInterp(start.G, end.G, percentage),
LinearInterp(start.B, end.B, percentage));
public Color GradientPick(double percentage, Color Start, Color Center, Color End) {
if (percentage < 0.5)
return ColorInterp(Start, Center, percentage / 0.5);
else if (percentage == 0.5)
return Center;
else
return ColorInterp(Center, End, (percentage - 0.5)/0.5);
}
你会像这样使用它:
var Start = Color.FromArgb(255, 0, 255, 0);
var Center = Color.FromArgb(255, 255, 165, 0);
var End = Color.FromArgb(255, 255, 0, 0);
var Pick = GradientPick(0.75, Start, Center, End);