给定 N 个桶,我想在彩虹上连续生成颜色(其中 n>=2):
例如,如果 n=2,颜色将是:
rgb(255,0,0) -->rgb(0,0,255)
如果 n=3,颜色将是:
rgb(255,0,0) --> rgb(0,255,0) --> rgb(0,0,255)
生成这些颜色代码的好方法是什么?
给定 N 个桶,我想在彩虹上连续生成颜色(其中 n>=2):
例如,如果 n=2,颜色将是:
rgb(255,0,0) -->rgb(0,0,255)
如果 n=3,颜色将是:
rgb(255,0,0) --> rgb(0,255,0) --> rgb(0,0,255)
生成这些颜色代码的好方法是什么?
您的彩虹渐变平滑地将色调从 0 度变为 240 度(纯蓝色的色调)。因此,使用例如 HSL 值而不是 RGB 值将是最容易的,因此您可以在保持饱和度和亮度不变的情况下改变色调。
colorsys库允许在不同颜色空间之间进行转换,因此您可以根据需要使用它沿彩虹渐变生成 RGB 值。该hls_to_rgb
函数使用 0 到 1 之间的浮点值,2/3
蓝色的色调也是如此,明亮的颜色应该具有 0 的亮度0.5
和 0 的饱和度1
。
from colorsys import hls_to_rgb
def rainbow_color_stops(n=10, end=2/3):
return [ hls_to_rgb(end * i/(n-1), 0.5, 1) for i in range(n) ]
结果是一个(r,g,b)
元组列表。
这是一个小脚本,使用 kaya3 关于 HSV 的建议。是一个有趣的小练习。
import colorsys
import numpy as np
from matplotlib import pyplot as plt
def spectrum(n : int):
hsv = [(h, 1, 1) for h in np.linspace(0, 240/360, n)]
rgb = [colorsys.hsv_to_rgb(*tup) for tup in hsv]
defloat = lambda x: tuple((int(255 * i) for i in x))
return [defloat(x) for x in rgb]
if __name__ == '__main__':
n = 100
rgb = np.array(spectrum(n))
rgb = rgb.reshape((1, n, 3))
rgb = np.tile(rgb, (n, 1, 1))
plt.imshow(rgb)
plt.show()
使用 RGB 比例,红色从 开始,(255,0,0)
中间的绿色在(0,255,0)
,结束,蓝色,在(0,0,255)
。我们可以通过从开始(255,0,0)
并“步进”直到我们到达结束来移动规模。
假设从红色到绿色有 256*2 步(红色从 256->0 和绿色从 0->256)和 256*2 从绿色到蓝色。这达到 1024 步。现在我们可以将 1024 除以我们想要的桶数n
。这是一个例子:
def generate_gradient_rgbs(num_buckets):
rgb_codes = []
step_size = 1024 / num_buckets
for step in range(0,num_buckets):
red = int(max(0, 255 - (step_size*step*0.5))) # step size is half of the step size since both this item goes down and the next one goes up
blue = int(max(0, 255 - (step_size*0.5*(num_buckets-step-1))))
green = (255 - red) if red else (255 - blue)
rgb_codes.append((red, green, blue))
return rgb_codes
>>> generate_gradient_rgbs(4) [(255, 0, 0), (127, 128, 0), (0, 128, 127), (0, 0, 255)]
当然,这是一个起点,但对于获得 rgb 的快速而简单的方法,这是一种可能的方法。