Python PIL 0.5 不透明度、透明度、透明通道

17 投票
6 回答
51610 浏览
提问于 2025-04-18 13:12

有没有什么方法可以让一张图片变得半透明呢?

伪代码大概是这样的:

from PIL import Image
image = Image.open('image.png')
image = alpha(image, 0.5)

我在网上搜索了好几个小时,但找不到任何有用的信息。

6 个回答

1

这个方法可以在把logo粘贴到图片上之前,先降低它的透明度,让它看起来更柔和。

# pip install Pillow
# PIL.__version__ is 9.3.0

from PIL import Image, ImageEnhance

im = Image.open('logo.png').convert('RGBA')
alpha = im.split()[3]
alpha = ImageEnhance.Brightness(alpha).enhance(.5)
im.putalpha(alpha)
2

我遇到了一个问题,就是在给我的图片应用 putalpha() 时,图片周围出现了黑色的框框。

这个解决办法(在复制的图层上应用透明度)帮我解决了这个问题。

from PIL import Image
with Image.open("file.png") as im:
    im2 = im.copy()
    im2.putalpha(180)
    im.paste(im2, im)
    im.save("file2.png")

解释:

就像我说的,putalpha 会改变所有像素的透明度值,所以原本完全透明的像素变成了部分透明。上面我发的代码首先在一个复制的图层上使用 putalpha 把所有像素设置为半透明,然后再用 paste 把这些像素复制回原来的图片,同时使用原来的透明度值作为遮罩。这就意味着在 paste 的时候,原图中完全透明的像素会被跳过。

2

我把Pecan的回答和cr333的问题结合在一起,来自这个问题:

使用PIL让所有白色像素变透明?

... 然后我得到了这个:

from PIL import Image

opacity_level = 170 # Opaque is 255, input between 0-255

img = Image.open('img1.png')
img = img.convert("RGBA")
datas = img.getdata()

newData = []
for item in datas:
    newData.append((0, 0, 0, opacity_level))
else:
    newData.append(item)

img.putdata(newData)
img.save("img2.png", "PNG")

在我的情况下,我有一段黑色背景的文字,我只想让背景半透明,这样的话:

from PIL import Image

opacity_level = 170 # Opaque is 255, input between 0-255

img = Image.open('img1.png')
img = img.convert("RGBA")
datas = img.getdata()

newData = []
for item in datas:
    if item[0] == 0 and item[1] == 0 and item[2] == 0:
        newData.append((0, 0, 0, opacity_level))
    else:
        newData.append(item)

img.putdata(newData)
img.save("img2.png", "PNG")
4

你能这样做吗?

from PIL import Image
image = Image.open('image.png') #open image
image = image.convert("RGBA")  #convert to RGBA
rgb = image.getpixel(x,y) #Get the rgba value at coordinates x,y
rgb[3] = int(rgb[3] / 2) or you could do rgb[3] = 50 maybe? #set alpha to half somehow
image.putpixel((x,y), rgb) #put back the modified reba values at same pixel coordinates

这绝对不是最有效的方法,但可能能实现你的需求。我是在浏览器里写的代码,所以可能会有错误,但希望它能给你一些启发。

补充:刚注意到这个问题已经很久了。不过还是留下这个回答,希望能帮到未来的人。:)

28

我知道这个问题已经很久了,但在当前版本的Pillow(v4.2.1)中,有一个叫做 putalpha 的函数。对我来说,它似乎工作得很好。我不确定它是否适用于所有需要更改透明度的情况,但它确实有效。这个函数可以为图像中的每个像素设置透明度值。不过,你似乎可以使用一个遮罩:http://www.leancrew.com/all-this/2013/11/transparency-with-pil/

使用 putalpha 的方法如下:

from PIL import Image
img = Image.open(image)
img.putalpha(127)  # Half alpha; alpha argument must be an int
img.save(dest)

撰写回答