PIL Python 实现双色线性渐变定位

5

对于许多人来说,这可能很容易。

我正在尝试从两种颜色创建一个背景。意图是它从左侧开始一种颜色,并在其右侧以另一种颜色结束(水平方向)。

问题是我有从角落到角落的渐变,而我想要的是它们并排。

我的代码:

from PIL import Image, ImageDraw

def interpolate(f_co, t_co, interval):
    det_co =[(t - f) / interval for f , t in zip(f_co, t_co)]
    for i in range(interval):
        yield [round(f + det * i) for f, det in zip(f_co, det_co)]


imgsize=(1920,1080)
gradient = Image.new('RGBA', imgsize, color=0)
draw = ImageDraw.Draw(gradient)

f_co = (253, 46, 216)
t_co = (23, 214, 255)
for i, color in enumerate(interpolate(f_co, t_co, gradient.width * 2)):
    draw.line([(i, 0), (0, i)], tuple(color), width=1)
gradient.show()

结果:https://i.imgur.com/p5slKTg.png


从左到右? - AKX
是的,就是这样。 - Jose Manuel
2个回答

4

对于从左到右的问题,最简单的解决方法就是修改draw.line的坐标为

draw.line([(i, 0), (0, i)], tuple(color), width=1)

to

draw.line([(i, 0), (i, gradient.height)], tuple(color), width=1)

interpolate() 中的 gradient.width * 2 调整为 gradient.width

结果如下所示:

enter image description here

对于从上到下,您需要调整 interpolate() 的参数来使用 gradient.height 并进行以下操作:

draw.line([(0, i), (gradient.width, i)], tuple(color), width=1)

结果是 enter image description here

非常感谢,这正是我所需要的。 我试图为您的帮助投票,但需要15个声望。当我获得它时,我会给您点赞。 - Jose Manuel

2

我认为我会采取不同的方法,而不是画3,840条线:

#!/usr/bin/env python3

import numpy as np
from PIL import Image

# Define start and end colours and image height and width
colourA=[255, 0, 255]
colourB=[0, 255, 255]
h, w = 1080, 1920

# Make output image
gradient = np.zeros((h,w,3), np.uint8)

# Fill R, G and B channels with linear gradient between two end colours
gradient[:,:,0] = np.linspace(colourA[0], colourB[0], w, dtype=np.uint8)
gradient[:,:,1] = np.linspace(colourA[1], colourB[1], w, dtype=np.uint8)
gradient[:,:,2] = np.linspace(colourA[2], colourB[2], w, dtype=np.uint8)

# Save result
Image.fromarray(gradient).save('result.png')

enter image description here


1
肯定会更快,但离OP的原始方法还有很大差距(而且难以适应任意角度) :) - AKX
假设其中一侧是透明的,那么会变成一种颜色,直到完全透明。 - Jose Manuel
您还可以轻松地添加渐变透明度。只需将颜色的第四个元素添加到RGBA中,使结果成为4通道,使用gradient = np.zeros((h,w,4), np.uint8)创建渐变图像,并在alpha通道中添加一行以生成线性渐变gradient[:,:,3] = np.linspace(colourA[3], colourB[3], w, dtype=np.uint8) - Mark Setchell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接