如何在python中平滑过渡颜色?



我不断地将输出存储在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)))

免责声明:我是一名图像/视频专家,我没有使用过树莓派进行照明。我想现在,你的照明从全红到全绿再到全蓝,变化非常突然。我描述了一种使这种变化更加渐进的方法,但它可能效率低下,并且可能有一种特定于平台的更简单的方法。

您需要定义一个转换时间(例如t)。另外,您应该了解颜色由pixels.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提供给pixels.fill()的问题。或者,您可以使用您的函数:

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

这应该给你一个非线性的颜色过渡,其中蓝色从0到255,红色从255到0(红色到蓝色)。

*或者可能(B,G,R)。

最新更新