我正在尝试创建一个图像并用半透明的黑色填充它:
from PIL import Image
from PIL import ImageFont
from PIL import ImageDraw
from PIL import ImageEnhance
fnt = create_font()
# my background rectangle
img1 = Image.new("RGBA", 100, 100, color=(0, 0, 0, 230)) #RGBA
dr1 = ImageDraw.Draw(img1)
dr1.text((5, 5), "some text", font=fnt)
# my source image
my_img.paste(dr1, (10, 10))
my_img.save(out_file, "JPEG")
但它忽略了“230”是透明度水平。如果我将其更改为“0”或任何其他数字,则为“dr1”矩形的透明度级别 保持不变 - 它完全是黑色。
更新
我在jpeg my_img
中有一个来源。我想在文本的img1
部分放置一个半透明的矩形。我怎样才能做到这一点?如何让img1
更透明?
答案 0 :(得分:3)
首先,JPEG不支持透明度,因此如果您想要一个具有透明度的图像文件,您需要使用不同的格式,例如PNG。
我不知道create_font
函数的定义在哪里;在我的PIL ImageFont中没有该名称的功能(我在32位Linux上使用PIL.PILLOW_VERSION ==' 3.3.0'在Python 3.6上)。
此外,粘贴操作无法正常工作,但您并不需要它。
这是您的代码的修改版本。
from PIL import Image, ImageFont, ImageDraw
img1 = Image.new("RGBA", (100, 100), color=(0, 0, 0, 64))
dr1 = ImageDraw.Draw(img1)
fnt = ImageFont.load_default()
dr1.text((5, 5), "some text", font=fnt, fill=(255, 255, 0, 128))
#img1.show()
img1.save('test.png')
这是它创建的PNG文件:
这里有一些代码用于更新您的问题。
from PIL import Image, ImageFont, ImageDraw
img1 = Image.open('hueblock.jpg').convert("RGBA")
overlay = Image.new("RGBA", (100, 100), color=(0, 0, 0, 63))
dr1 = ImageDraw.Draw(overlay)
fnt = ImageFont.load_default()
dr1.text((5, 5), "some text", font=fnt, fill=(255, 255, 255, 160))
img1.paste(overlay, (64, 64), overlay)
img1.show()
img1.save('test.jpg')
以下是 hueblock.jpg 和 test.jpg
请注意粘贴调用的参数:
img1.paste(overlay, (64, 64), overlay)
最后一个参数是图像蒙版。通过提供RGBA图像作为掩码arg,其alpha通道用作掩码,如the Pillow docs中所述
[...]如果给出了掩码,则此方法仅更新区域 由面具表示。您可以使用“1”,“L”或“RGBA”图像 (在后一种情况下,alpha波段用作掩模)。哪里的面具 是255,给定的图像按原样复制。掩码为0的地方 当前值保留。中间值会混合两者 图像在一起,包括他们的alpha通道。
答案 1 :(得分:1)
您将图像文件保存为JPEG
。
JPEG不支持透明度。为了使图像具有透明度,您必须另存为支持图像透明度的格式,例如PNG
。