C# 提取颜色梯度像素信息
我正在尝试使用artnet-to-dmx控制器控制240长线RGB像素(ws2812b),并且需要在像素线长度下生成颜色渐变 我的想法是使用C#内置图形库生成颜色渐变,然后提取单个像素值并将其发送到dmx控制器C# 提取颜色梯度像素信息,c#,graphics,colors,drawing,2d,C#,Graphics,Colors,Drawing,2d,我正在尝试使用artnet-to-dmx控制器控制240长线RGB像素(ws2812b),并且需要在像素线长度下生成颜色渐变 我的想法是使用C#内置图形库生成颜色渐变,然后提取单个像素值并将其发送到dmx控制器 是否可以从应用于形状(直线/矩形等)的LinearGradientBrush或LinearGradientBrush中提取单个插值?您可以做的是让画笔在位图上画一条线,并从中提取像素,但我相信这将是不必要的昂贵和复杂。更好的方法是在你想要的颜色之间 这可以通过编写lerp方法来实现,如下
是否可以从应用于形状(直线/矩形等)的LinearGradientBrush或LinearGradientBrush中提取单个插值?您可以做的是让画笔在位图上画一条线,并从中提取像素,但我相信这将是不必要的昂贵和复杂。更好的方法是在你想要的颜色之间 这可以通过编写lerp方法来实现,如下所示:
float Lerp(float from, float to, float amount)
{
return from + amount * (to - from);
}
用它来表示你想要在其中进行lerp的颜色的RG和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));
}
我希望这有帮助。~Luca这是一个函数,它获取停止颜色列表并返回均匀插值颜色列表:
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 ColorList=新列表();
使用(位图bmp=新位图(计数,1))
使用(Graphics G=Graphics.FromImage(bmp))
{
矩形bmpCRect=新矩形(Point.Empty,bmp.Size);
LinearGradientBrush br=新的LinearGradientBrush
(bmpCRect,Color.Empty,Color.Empty,0,false);
ColorBlend cb=新的ColorBlend();
cb.Colors=stopColors.ToArray();
float[]位置=新的float[stopColors.Count];
对于(int i=0;i
你可以称之为:
List<Color> ColorList = interpolateColors(
new List<Color>{Color.Red, Color.Blue, Color.Yellow}, 240);
List ColorList=插值颜色(
新列表{Color.Red,Color.Blue,Color.Yellow},240);
240和740种颜色。要获得所有不同的颜色,请确保它们不是太多也不是太近,因为两种颜色之间的RGB色调的最大数量是256,因此第二个示例可能会达到该限制。只需在所需长度和高度的位图上绘制=
1
,即可轻松且便宜。然后使用GetPixel拉出所有颜色。。!有关绘制条纹和提取渐变颜色列表的示例,请参见(查看interpolecolors
函数!比编写函数进行计算要便宜得多