2015-01-31 2 views
0

В настоящее время я работаю над библиотекой DMX для C# .NET. В настоящий момент я застрял в создании цветового перехода на основе «начального цвета» и «цвета конца».Перемещение цвета на основе объектов System.Drawing.Color

Функция принимает 3 аргумента, сначала объект DMXController (в основном расширенный SerialPort), второй - startColor, а третий - endColor.

Вся трассировка будет обрабатываться в отдельном потоке, поэтому приложение не будет висеть.

Клиент DMX только светодиодный RGB контроллер так он принимает буквально значения 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(); 
    } 

Если это быстрее, чтобы извлечь г, г, б значения из цветных объектов, прежде чем начать переход я осуществить это.

+1

Я обнаружил, что цветовые переходы можно очень легко извлечь из результата линейной градиентной заливки. – TaW

+0

TaW, спасибо за ваш комментарий. Вы имеете в виду создание линейной градиентной щетки с прямоугольником шириной 255 и 1 высотой для получения градиента, а затем получить пиксель цвета по пикселям (приращение позиции x)? –

+1

Точно. Конечно, не будет 256 различий между цветами __all__, но в 24-битном пространстве RGB их также больше не будет. ((И если вы хотите использовать больше цветов, есть хороший формат для расширения lgb ..) – TaW

ответ

1

OK, исправно! Это рабочий код:

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(); 
    } 
} 
Смежные вопросы