【问题标题】:Get a color value within a gradient based on a value根据值获取渐变中的颜色值
【发布时间】:2019-04-09 21:07:09
【问题描述】:

假设我有以下渐变:

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

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

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

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

【问题讨论】:

  • 如果你有一个简单的从开始到中心和中心到结束的 RGB 线性渐变,你可以简单地通过线性插值来计算新的 RGB 值,根据它是高于还是低于中心.

标签: c# wpf gradient


【解决方案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);

【讨论】:

  • 非常好,效果很好!绝对比加载图像和读取它的像素更好。 :P 谢谢!
猜你喜欢
  • 2022-01-16
  • 2014-08-12
  • 1970-01-01
  • 1970-01-01
  • 2018-03-24
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多