提取颜色渐变像素信息

时间:2015-11-03 10:06:17

标签: c# graphics colors drawing 2d

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

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

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

2 个答案:

答案 0 :(得分:0)

你可以做的是让画笔在位图上画一条线并从中提取像素,但我相信这将是不必要的昂贵和复杂。更好的是你想要的颜色之间只有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));
}

我希望这会有所帮助 〜卢卡

答案 1 :(得分:0)

这是一个获取停止颜色列表并返回均匀插值颜色列表的函数:

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

enter image description here enter image description here

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