Python PIL 0.5 不透明度、透明度、透明通道
有没有什么方法可以让一张图片变得半透明呢?
伪代码大概是这样的:
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的问题结合在一起,来自这个问题:
... 然后我得到了这个:
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)