Python PIL 0.5透明度、透明度和alpha

17

有没有办法使图像半透明?

伪代码大致如下:

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

我谷歌了几个小时,但找不到任何有用的信息。


答案必须使用PIL吗?我不认为有一种特定模块可以实现这个。 - 雨が好きな人
reduce_opacity()这个问题中有帮助吗? - Hugo
6个回答

27

我知道这个问题很老,但是在当前版本的Pillow(v4.2.1)中,有一个名为putalpha的函数。对我来说它似乎运作良好。我不知道是否适用于每种需要更改Alpha的情况,但它确实有效。它设置图像中每个像素的Alpha值。然而,你似乎可以使用一个遮罩: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)

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

这绝对不是最有效的做法,但它可能会起作用。我在浏览器中编写了代码,所以可能不是没有错误,但希望它能给您提供一个想法。

编辑:刚注意到这个问题很旧了。无论如何,留下答案以供将来使用。:)


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")

2

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

通过复制图层并在其中应用alpha通道解决了这个问题。

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 通过设置像素的 alpha 值来修改所有像素,因此完全透明的像素变为部分透明。我上面发布的代码首先在副本中将 (putalpha) 所有像素设置为半透明,然后使用原始 alpha 值作为掩码将所有像素复制 (paste) 到原始图像中。这意味着原始图像中的完全透明像素在 paste 过程中被跳过。


1

这种方法可以在将透明度降低的标志放置在图像上之前,帮助减少标志的不透明度。

# 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)

0

我刚刚自己完成了这个...虽然我的代码可能有点奇怪...但它运行得很好。所以我在这里分享一下。希望能帮到任何人。=)

思路:将图片透明化,即降低元组中的第四个元素alpha值。

我的框架代码:

from PIL import Image 
img=open(image)
img=img.convert('RGBA')  #you can make sure your pic is in the right mode by check img.mode
data=img.getdata()  #you'll get a list of tuples
newData=[]
for a in data:
    a=a[:3] #you'll get your tuple shorten to RGB
    a=a+(100,) #change the 100 to any transparency number you like between (0,255)
    newData.append(a)
img.putdata(newData) #you'll get your new img ready
img.save(filename.filetype)

我没有找到合适的命令来自动完成这项工作,所以我自己写了这个。希望它能再次帮助。XD


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