0

現在、C# .NET 用の DMX ライブラリに取り組んでいます。現時点では、「開始色」と「終了色」に基づいて色の遷移を作成することに固執しています。

この関数は 3 つの引数を取ります。1 つ目は DMXController オブジェクト (基本的には拡張された SerialPort)、2 つ目は startColor、3 つ目は endColor です。

全体の処理は別のスレッドで処理されるため、アプリケーションがハングすることはありません。

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 の値を抽出する方が速い場合は、それを実装します。

4

1 に答える 1

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();
    }
}
于 2015-01-31T23:31:59.453 に答える