Generating color gradient in Python

2019-06-12 01:57发布

i have a list of RGB colors and need to draw gradient between them in python. Have you any suggestions how to make it usin PIL library?

EDIT: I get this:

def gradient(list_of_colors):
    width = 600
    height = 480
    img = Image.new("RGB", (width, height))
    draw = ImageDraw.Draw(img)

    for i in range(len(list_of_colors)):
        r1,g1,b1 = list_of_colors[i]
        for x in range(width/len(list_of_colors)):
            colour = (r1,g1,b1)
            draw.line((x+(width/len(list_of_colors)*i), 0, x+(width/len(list_of_colors)*i), height), fill=colour)

    img.show()

gradient([(30, 198, 244), (99, 200, 72),(120, 50, 80),(200, 90, 140)])

and it draw me this: http://img59.imageshack.us/img59/1852/3gba.png

I just need to make it gradient between those colors not stripes of colors. (something like this) http://www.kees-tm.nl/uploads/colorgradient.jpg

1条回答
Animai°情兽
2楼-- · 2019-06-12 02:12

I think code like this will work, it uses Linear Interpolation to create the gradient.

list_of_colors = [(30, 198, 244), (99, 200, 72),(120, 50, 80),(200, 90, 140)]

no_steps = 100

def LerpColour(c1,c2,t):
    return (c1[0]+(c2[0]-c1[0])*t,c1[1]+(c2[1]-c1[1])*t,c1[2]+(c2[2]-c1[2])*t)

for i in range(len(list_of_colors)-2):
    for j in range(no_steps):
        colour = LerpColour(list_of_colors[i],list_of_colors[i+1],j/no_steps)

Obviously I don't know how you are drawing the gradient so I've left it open to you, do what you like with the colour variable to draw each step of the gradient within the for loop. :)

Also: I don't understand list generation so if anyone can improve the LerpColour function to use it please edit my post :)

EDIT - Generating a list that can easily be iterated over when drawing with PIL:

gradient = []
for i in range(len(list_of_colors)-2):
    for j in range(no_steps):
        gradient.append(LerpColour(list_of_colors[i],list_of_colors[i+1],j/no_steps))
查看更多
登录 后发表回答