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

问题描述 投票:0回答:1

假设我有以下渐变:

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

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

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

但现在价值每秒都在变化。而且我想我在某处读到GetPixel函数相对较慢。当然我现在可以编程出来(之后我可能会为了测试目的而做),但在我看来它是非常耗费资源的。还有更好的选择吗?

c# wpf gradient
1个回答
1
投票

这是RGB空间中颜色之间的简单线性插值,使用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);
© www.soinside.com 2019 - 2024. All rights reserved.