【问题标题】:Extract colour gradient pixel information提取颜色渐变像素信息
【发布时间】:2016-02-03 10:30:56
【问题描述】:

我正在尝试使用 artnet 到 dmx 控制器来控制一条 240 长的 RGB 像素线 (ws2812b),并且需要沿着像素线的长度生成颜色渐变。

我的想法是使用内置的 C# 图形库来生成颜色渐变,然后提取单个像素值并将它们发送到 dmx 控制器。

是否可以从应用于形状(线/矩形等)的 LinearGradientBrush 或 LinearGradientBrush 中提取单独的插值?

【问题讨论】:

  • 只需在所需长度和高度 = 1 的位图上绘制,既简单又便宜。然后使用 GetPixel 拉出所有颜色..!请参阅here 获取绘制条纹的示例,here 获取提取渐变颜色列表的示例(查看 interpolateColors 函数!比编写函数来计算要便宜得多
  • 您能否显示您的代码或链接到显示您如何接收 artnet 数据包的内容?

标签: c# graphics colors drawing 2d


【解决方案1】:

你可以做的是让画笔在位图上画一条线并从中提取像素,但我相信这会不必要地昂贵和复杂。更好的是在你想要的颜色之间简单地lerping

这可以通过编写这样的 lerp 方法来实现:

float Lerp(float from, float to, float amount)
{
    return from + amount * (to - from);
}

并将其用于您想要在其间调整的颜色的 R G 和 B 值。例如:

Color Lerp(Color from, Color to, float amount)
{
    return Color.FromArgb(
        (int)Lerp(from.R, to.R, amount),
        (int)Lerp(from.G, to.G, amount),
        (int)Lerp(from.B, to.B, amount));
}

我希望这会有所帮助。
~卢卡

【讨论】:

    【解决方案2】:

    这是一个函数,它接受一个停止颜色列表并返回一个均匀插值的颜色列表:

    List<Color> interpolateColors(List<Color> stopColors, int count)
    {
        List<Color> ColorList = new List<Color>();
    
        using (Bitmap bmp = new Bitmap(count, 1))
        using (Graphics G = Graphics.FromImage(bmp))
        {
            Rectangle bmpCRect = new Rectangle(Point.Empty, bmp.Size);
            LinearGradientBrush br = new LinearGradientBrush
                                    (bmpCRect, Color.Empty, Color.Empty, 0, false);
            ColorBlend cb = new ColorBlend();
    
            cb.Colors = stopColors.ToArray();
            float[]  Positions = new float[stopColors.Count];
            for (int i = 0; i < stopColors.Count; i++) 
                  Positions [i] = 1f * i / (stopColors.Count-1);
            cb.Positions = Positions;
            br.InterpolationColors = cb;
            G.FillRectangle(br, bmpCRect);
            for (int i = 0; i < count; i++) ColorList.Add(bmp.GetPixel(i, 0));
            br.Dispose();
        }
        return ColorList;
    }
    

    你可以这样称呼它:

    List<Color> ColorList = interpolateColors(
                            new List<Color>{Color.Red, Color.Blue, Color.Yellow}, 240);
    

    240 和 740 色。要获得所有不同的颜色,请确保它们不要太多且不要太接近,因为两种颜色之间的最大 RGB 色调数为 256,因此第二个示例可能会达到该限制..

    【讨论】:

      猜你喜欢
      • 2012-03-15
      • 2011-05-09
      • 1970-01-01
      • 2012-11-22
      • 2013-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      相关资源
      最近更新 更多