C# 提取颜色梯度像素信息

C# 提取颜色梯度像素信息,c#,graphics,colors,drawing,2d,C#,Graphics,Colors,Drawing,2d,我正在尝试使用artnet-to-dmx控制器控制240长线RGB像素(ws2812b),并且需要在像素线长度下生成颜色渐变 我的想法是使用C#内置图形库生成颜色渐变,然后提取单个像素值并将其发送到dmx控制器 是否可以从应用于形状(直线/矩形等)的LinearGradientBrush或LinearGradientBrush中提取单个插值?您可以做的是让画笔在位图上画一条线,并从中提取像素,但我相信这将是不必要的昂贵和复杂。更好的方法是在你想要的颜色之间 这可以通过编写lerp方法来实现,如下

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

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


是否可以从应用于形状(直线/矩形等)的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
函数!比编写函数进行计算要便宜得多