Python Pillow:在图像中添加透明渐变

3

我需要在图片中添加透明渐变,就像下面的图片一样。我尝试过以下方法:

def test(path):
    im = Image.open(path)
    if im.mode != 'RGBA':
        im = im.convert('RGBA')
    width, height = im.size
    gradient = Image.new('L', (width, 1), color=0xFF)
    for x in range(width):
        gradient.putpixel((0 + x, 0), x)
    alpha = gradient.resize(im.size)
    im.putalpha(alpha)
    im.save('out.png', 'PNG')

然而我只添加了白色渐变。如何改变渐变的颜色和控制渐变的大小?

我需要像下面这样,但不需要文字。

this

1个回答

6

您的代码实际上做到了它所说的那样。但是,如果您的图像背景不是黑色而是白色,则图像将显得更亮。以下代码将原始图像与黑色图像合并,这样您就可以获得暗渐变效果,无论背景如何。

def test(path):
    im = Image.open(path)
    if im.mode != 'RGBA':
        im = im.convert('RGBA')
    width, height = im.size
    gradient = Image.new('L', (width, 1), color=0xFF)
    for x in range(width):
        gradient.putpixel((x, 0), 255-x)
    alpha = gradient.resize(im.size)
    black_im = Image.new('RGBA', (width, height), color=0) # i.e. black
    black_im.putalpha(alpha)
    gradient_im = Image.alpha_composite(im, black_im)
    gradient_im.save('out.png', 'PNG')

编辑

有不同的方法来缩放梯度。以下是一种建议。

def test(path, gradient_magnitude=1.):
    im = Image.open(path)
    if im.mode != 'RGBA':
        im = im.convert('RGBA')
    width, height = im.size
    gradient = Image.new('L', (width, 1), color=0xFF)
    for x in range(width):
        # gradient.putpixel((x, 0), 255-x)
        gradient.putpixel((x, 0), int(255 * (1 - gradient_magnitude * float(x)/width)))
    alpha = gradient.resize(im.size)
    black_im = Image.new('RGBA', (width, height), color=0) # i.e. black
    black_im.putalpha(alpha)
    gradient_im = Image.alpha_composite(im, black_im)
    gradient_im.save('out.png', 'PNG')

谢谢。看起来可以工作。但是我如何控制渐变的大小?我不需要在整个图像上使用渐变。 - saa
抱歉,我跳过了梯度幅值,看起来没问题,我应该多试一下。谢谢! - saa
也许你知道。我该如何增加不透明度?左边非常黑暗。 - saa
我不太明白你的意思。你是想用深灰色代替黑色来创建一个渐变吗?无论如何,如果有新问题,请开启一个新的提问。 - Paul Brodersen
你是正确的。新问题:https://dev59.com/h5vga4cB1Zd3GeqP3IXX - saa

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