我正在尝试使用artnet到dmx控制器来控制240长的RGB像素线(ws2812b),并且需要在像素线的长度内生成颜色渐变。
我想到使用C#内置图形库来生成颜色渐变,然后提取单个像素值并将它们发送到dmx控制器。
是否可以从应用于形状(线/矩形等)的LinearGradientBrush或LinearGradientBrush中提取单个插值?
答案 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);
240和740种颜色。要获得所有不同的颜色,请确保它们不是太多而不是太近,因为两种颜色之间的RGB色调的最大数量是256,所以第二个示例可能会达到这个限制..