使用Python PIL库将图像垂直淡化为透明度

时间:2013-10-07 22:10:14

标签: python png transparency python-imaging-library

我已经查看了教程,其他stackoverflow问题和PIL文档本身,但我仍然不确定如何做到这一点。

我想开始垂直淡化y轴约55%的图像,并使图像完全透明,约为75%。尽管最后25%左右应完全透明,但保留图像的整个高度非常重要。

这可能与PIL有关吗?

3 个答案:

答案 0 :(得分:4)

当然可行。

让我们假设你开始时没有透明度的图像(因为否则,你的问题是模棱两可的)。

步骤1:添加alpha平面。那只是putalpha,除非您处理的是非平面图像,在这种情况下,您需要先将其转换为RGB或L.

第2步:使用load(或getpixelsetpixel返回的像素数组迭代要更改的像素(如果必须处理古老版本的PIL)

步骤3:没有第3步。除非您计算保存图像。在这种情况下,OK,第3步是保存图像。

from PIL import Image

im = Image.open('bird.jpg')
im.putalpha(255)
width, height = im.size
pixels = im.load()
for y in range(int(height*.55), int(height*.75)):
    alpha = 255-int((y - height*.55)/height/.20 * 255)
    for x in range(width):
        pixels[x, y] = pixels[x, y][:3] + (alpha,)
for y in range(y, height):
    for x in range(width):
        pixels[x, y] = pixels[x, y][:3] + (0,)
im.save('birdfade.png')

这里alpha从255线性下降到0;你希望它根据不同的曲线下降,或者你使用的是RGB16而不是RGB8,或者你使用L而不是RGB,你应该能够弄清楚如何改变它。


如果你想更快地做到这一点,你可以在步骤2中使用numpy而不是Python循环。或者你可以提前反转步骤1和2 - 构建一个alpha平面,并通过传递给它来一次性应用它putalpha代替255。或者......由于这个在我躺着的最大图像上花了不到半秒钟,我不太担心性能,除非你必须做一百万个并且你想要一个更快的版本。

答案 1 :(得分:3)

使用NumPy:

import numpy as np
import Image

img = Image.open(FILENAME).convert('RGBA')
arr = np.array(img)
alpha = arr[:, :, 3]
n = len(alpha)
alpha[:] = np.interp(np.arange(n), [0, 0.55*n, 0.75*n, n], [255, 255, 0, 0])[:,np.newaxis]
img = Image.fromarray(arr, mode='RGBA')
img.save('/tmp/out.png')

答案 2 :(得分:0)

如果要淡化已经具有透明背景的图像(@abarnert),则必须稍微更改detail的代码:

<a href="<?php echo $plattegrondlinks['url']; ?>" title="Lightbox link - please check documentation of Lightbox" class="lightbox">
    <img src="<?php echo $plattegrondlinks['url']; ?>" alt="<?php echo $plattegrondlinks['alt'] ?>" class="img-responsive" />
</a>