我已经查看了教程,其他stackoverflow问题和PIL文档本身,但我仍然不确定如何做到这一点。
我想开始垂直淡化y轴约55%的图像,并使图像完全透明,约为75%。尽管最后25%左右应完全透明,但保留图像的整个高度非常重要。
这可能与PIL有关吗?
答案 0 :(得分:4)
当然可行。
让我们假设你开始时没有透明度的图像(因为否则,你的问题是模棱两可的)。
步骤1:添加alpha平面。那只是putalpha
,除非您处理的是非平面图像,在这种情况下,您需要先将其转换为RGB或L.
第2步:使用load
(或getpixel
和setpixel
返回的像素数组迭代要更改的像素(如果必须处理古老版本的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>