Цвет в качестве фона с использованием кодов RGB, которые будут постоянно меняться со временем

Public Class Form1
    Private Sub Timer1_Tick() Handles Timer1.Tick
        Label1.Text = TimeOfDay
        Label2.Text = System.DateTime.Now.ToString("MM/d/yyy")
        Me.BackColor = ColorTranslator.FromHtml("#" & DateAndTime.Now.ToString("HHmmss"))
        Label1.ForeColor = Color.White
        Label2.ForeColor = Color.White
    End Sub
End Class

В моем коде выше цвет фона меняется на шестнадцатеричный цветовой код в зависимости от времени. Однако я хотел бы изменить это, потому что цвета, которые идут с этими кодами, слишком темные.

Вместо этого я ищу код, чтобы сделать цвет фона% в красных, зеленых и синих контейнерах. (Цвета RGB)

Например, если время 11:22:33, то я хотел бы, чтобы цвет фона был 11% красным, 22% зеленым и 33% синим. Имеет ли это смысл? Я новичок и приветствую любую помощь.


person Lilly    schedule 31.12.2014    source источник


Ответы (1)


Вам нужно интерполировать между 0 и 255 и использовать интерполированное значение как красное, зеленое или синее значение вместо прямого использования компонента времени, если вы хотите использовать полный диапазон цветов. Это потому, что каждый компонент цвета представлен по 1 байту.

Вы в основном растягиваете свои 0-24 часа до значений 0-255, где Hour = 0 соответствует Red = 0, а Hour = 24 соответствует Red = 255.

Dim R As Byte = CByte(Date.Now.Hour / 23 * 255)

Это очень похоже на ваш подход «11% красного». Остальные части будут определены аналогично,

Dim G As Byte = CByte(Date.Now.Minute / 59 * 255)
Dim B As Byte = CByte(Date.Now.Second / 59 * 255)

Формула линейной интерполяции в общем случае

New_Value = (Value - Min) / (Max - Min) * (New_Max - New_Min) + New_Min

Здесь Min и New_Min равны 0, что несколько упрощает формулу.

Чтобы фактически назначить цвет, вам не нужно устанавливать его путем создания цвета HTML. Вы просто можете использовать функцию Color.FromArgb. Просто введите его в Visual Studio. По какой-то причине IntelliSense (функция, которая показывает, какие методы доступны при вводе текста в среде IDE) в некоторых случаях скрывает эту функцию.

Me.BackColor = Color.FromArgb(R, G, B)

Это ничем не отличается от вашего подхода HTML, только проще (значение #321224 - это просто представление трех байтов в шестнадцатеричном виде в форме #RRGGBB).


В самом строгом смысле приведенный выше ответ - это не совсем то, что вы хотели использовать. Чтобы использовать свой процентный подход, вы должны построить значения RGB как

Dim R As Byte = CByte(Date.Now.Hour / 100 * 255)
Dim G As Byte = CByte(Date.Now.Minute / 100 * 255)
Dim B As Byte = CByte(Date.Now.Second / 100 * 255)

но это также не даст вам полного цветового диапазона (даже 59% от 255 составляет всего 150, поэтому вы никогда не увидите значения между 150 и 255). Лучше всего использовать линейную интерполяцию.

person Jens    schedule 31.12.2014