根据值获取渐变内的颜色值

时间:2019-04-09 21:07:10

标签: c# wpf gradient

假设我具有以下渐变:

  • 开始(0):绿色(0、255、0)
  • 中心(0.5):橙色(255、165、0)
  • 结尾(1):红色(255,0,0)

现在是否存在基于每秒变化的值的计算或现有函数来从此渐变中读取颜色值?

我的想法:例如在Photoshop中,创建一个图像,例如宽100像素,高1像素。现在,我在整个表面上放置一个带有上述值和点的颜色渐变。我要获取其颜色的值也仅位于int值0和100之间。因此,我可以将此图像加载到一个变量中(不显示在UI中),然后根据我的值获取颜色使用“ GetPixel”功能,例如值是50,我会得到橙色,因为图像中的第50个像素对应于橙色。这可能是合理的,并且(理论上)易于编程。

但是现在值每秒钟更改一次。而且我想我在某处读到GetPixel函数相对较慢。当然,我现在可以对其进行编程(以后可能会出于测试目的而进行编程),但是在我看来,这是非常耗费资源的。有更好的选择吗?

1 个答案:

答案 0 :(得分:1)

这是使用System.Drawing.Color保留颜色的RGB空间中颜色之间的简单线性插值:

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);