可行
LLET假设您是从没有透明度的图像开始的(因为否则,您的问题是模棱两可的)。
步骤1:添加一个alpha平面。只是putalpha
步长2:通过使用
load
返回的像素阵列(如果必须处理古代版本的PIL)来更改您要更改的像素。 步骤3:没有步骤3。除非计算保存图像。在这种情况下,好的,步骤3正在保存图像。
getpixel
alpha在255上线性下降到0;它希望它根据不同的曲线下降,或者使用RGB16而不是RGB8,或者使用L而不是RGB,您应该能够弄清楚如何更改它。
如果您想更快地执行此操作,则可以使用numpy代替步骤2的python循环。或者您可以将步骤1和2逆转 - 提前构造一个alpha平面,并通过将其传递给setpixel
而不是
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')
putalpha
来立即应用。或者……由于这在我周围最大的图像上花了不到半秒的时间,所以我不太担心性能,除非您必须做一百万,并且想要更快的版本。
使用numpy:
255
如果您想淡入已经具有透明背景(
)的图像,则必须更改
@abarnert的代码:
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')
使用
from PIL import Image
im = Image.open('bird.jpg')
width, height = im.size
pixels = im.load()
for y in range(int(height*.55), int(height*.75)):
for x in range(width):
alpha = pixels[x, y][3]-int((y - height*.55)/height/.20 * 255) # change made here
if alpha <= 0:
alpha = 0
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,)
bg.save('birdfade.png')
我们可以生成梯度并将其设置为alpha通道:
图像