基于System.Drawing.Color对象的颜色转换

时间:2015-01-31 22:30:17

标签: c# colors dmx512

目前我正在使用C#.NET的DMX库。 目前我仍然坚持根据"开始颜色"创建颜色转换。和#34;结束颜色"。

该函数有3个参数,第一个是DMXController对象(基本上是扩展的SerialPort),第二个是startColor,第三个是endColor。

整个trahsition将在一个单独的线程中处理,因此应用程序不会挂起。

DMX客户端只是一个RGB LED控制器,所以它接受字面上的RGB值(例如红色= 255,0,0)

我已经看过一些固定颜色的例子,但是对于这个项目,可以使用任何颜色。

如果我更正了,则最多步数为255步。

最有效的方法是什么? 循环中的每一步都将被发送到DMXController,因此它必须是某种for-next或while循环,并且每一步都将被发送。

到目前为止,这是我的代码:

    public static void FadeColor(DMXController controller, Color startColor, Color endColor)
    {
        Color currentColor = startColor;

        Thread fadeColorThread = new Thread(delegate()
        {
            // Start For-Next / While loop

            // Update currentColor with new RGB values

            controller.SetChannel(1, currentColor.R);
            controller.SetChannel(2, currentColor.G);
            controller.SetChannel(3, currentColor.B);
            controller.Update();

            // If neccesary a delay like Thread.Sleep(5);

            // End For-Next / While loop

        });
        fadeColorThread.Name = "DMX Color Transition Thread";
        fadeColorThread.Start();
    }

如果在开始转换之前从颜色对象中提取r,g和b值更快,我将实现它。

1 个答案:

答案 0 :(得分:1)

好的,修好了!这是现在的工作代码:

    public static void FadeColor(DMXController controller, Color startColor, Color endColor, double accuracy = 1)
    {
        if (accuracy <= 0)
            return;

        Thread fadeColorThread = new Thread(delegate()
        {
            Color color = Color.Empty;
            using (Bitmap bmp = new Bitmap((int)(256 * accuracy), 1))
            {
                using (Graphics gfx = Graphics.FromImage(bmp))
                {
                    using (LinearGradientBrush brush = new LinearGradientBrush(new Point(0, 0), new Point(bmp.Width, bmp.Height), startColor, endColor))
                    {
                        gfx.FillRectangle(brush, brush.Rectangle);

                        controller.SetColor(startColor);

                        for (int i = 0; i < bmp.Width; i++)
                            controller.SetColor(bmp.GetPixel(i, 0));

                        controller.SetColor(endColor);
                    }
                }
            }
        });
        fadeColorThread.Name = "DMX Color Transition Thread";
        fadeColorThread.Start();
    }
}