Как плавно переходить между цветами в питоне? - PullRequest
3 голосов
/ 29 марта 2019

Я постоянно храню результаты в файле CSV. Я могу прочитать эти данные и вызвать изменение освещения с помощью приведенного ниже кода. Переход в освещении происходит внезапно, но в идеале я бы хотел сделать плавный переход от одного цвета к другому нелинейным способом, используя только RPi3 и neopixels / ws2812b.

df = pd.read_csv("output.csv")
second_last = df['modes'].iloc[-2]
last = df['modes'].iloc[-1]

if second_last == last and last == "one" :
    pixels.fill((255,0,0))
if second_last == last and last == "two" :
    pixels.fill((0,255,0))
if second_last == last and last == "three" :
    pixels.fill((0,0,255))

Я обнаружил, что для этого можно использовать функцию сглаживания, но я не уверен, как ее использовать на практике.

Как сделать, чтобы значения RGB следовали кривой, где начальный цвет равен 0, а цвет, на который он переходит, равен 1, если, например, используется следующая функция? Это жизнеспособный подход?

y = 0.5 * (1 + sin((x*pi)-(pi/2)))

1 Ответ

1 голос
/ 29 марта 2019

Отказ от ответственности: я специалист по изображениям и видео, и я не использовал Raspberry Pi для освещения.Я полагаю, что сейчас ваше освещение меняется от красного к зеленому и синему, и внезапно меняется.Я описываю способ сделать это изменение более постепенным, но, возможно, он неэффективен, и может быть более простой способ, специфичный для платформы.

Вам необходимо определить время (скажем, t ) для перехода.Кроме того, вы должны понимать, что цвет задается посредством пикселя.fill ((255,0,0)).Эти три значения (255,0,0) представляют собой (R, G, B) *.Если вы хотите промежуточные цвета, вам нужно иметь их комбинацию.Так, например, если вы хотите перейти с красного на синий, вам нужна последовательность из них с некоторыми промежуточными значениями.Линейно, это может быть что-то вроде:

max=255
step = 255//t
for i in range(0,t):
  red = 255 - (t*step)
  green = 0
  blue = 255 - red
  RGBtriplet = (red, green, blue)

Это вопрос передачи RGBtriplet в пиксель. Fill ().В качестве альтернативы вы можете использовать вашу функцию:

   blue = 255 * (0.5 * (1 + sin((t*pi)-(pi/2))))
   green = 0
   red = 255 - blue

Это должно дать вам нелинейный цветовой переход, где синий цвет изменяется от 0 до 255, а красный - от 255 до 0 (красный на синий).

* Или возможно (B, G, R).

...