如何使用 PIL 将透明 png 图像与另一幅图像合并
- 2025-02-18 09:24:00
- admin 原创
- 30
问题描述:
我有一张透明的 png 图像foo.png
,并且使用以下命令打开了另一张图像:
im = Image.open("foo2.png")
现在我需要的是foo.png
与合并foo2.png
。
(foo.png
包含一些文本,我想打印该文本foo2.png
)
解决方案 1:
from PIL import Image
background = Image.open("test1.png")
foreground = Image.open("test2.png")
background.paste(foreground, (0, 0), foreground)
background.show()
第一个参数是.paste()
要粘贴的图像。第二个参数是坐标,第三个参数是关键。它表示将用于粘贴图像的蒙版。如果您传递的是具有透明度的图像,则 alpha 通道将用作蒙版。
检查文档。
解决方案 2:
Image.paste
当背景图像也包含透明度时,无法按预期工作。您需要使用真正的Alpha 合成。
Pillow 2.0 包含一个alpha_composite
执行此操作的功能。
background = Image.open("test1.png")
foreground = Image.open("test2.png")
Image.alpha_composite(background, foreground).save("test3.png")
编辑:两个图像都需要是 RGBA 类型。因此,您需要调用convert('RGBA')
它们是否是调色板等。如果背景没有 alpha 通道,那么您可以使用常规粘贴方法(应该更快)。
解决方案 3:
正如olt已经指出的那样,当源和目标都包含 alphaImage.paste
时,无法正常工作。
请考虑以下情形:
两张测试图像均包含 alpha:
layer1 = Image.open("layer1.png")
layer2 = Image.open("layer2.png")
Image.paste
使用如下方法合成图像:
final1 = Image.new("RGBA", layer1.size)
final1.paste(layer1, (0,0), layer1)
final1.paste(layer2, (0,0), layer2)
生成以下图像(覆盖的红色像素的 alpha 部分完全取自第二层。像素未正确混合):
Image.alpha_composite
使用如下方法合成图像:
final2 = Image.new("RGBA", layer1.size)
final2 = Image.alpha_composite(final2, layer1)
final2 = Image.alpha_composite(final2, layer2)
产生以下(正确)图像:
解决方案 4:
也可以使用混合:
im1 = Image.open("im1.png")
im2 = Image.open("im2.png")
blended = Image.blend(im1, im2, alpha=0.5)
blended.save("blended.png")
解决方案 5:
下面是合并两张不同大小图像的代码,每张图像都有透明度和偏移量:
from PIL import Image
background = Image.open('image1.png')
foreground = Image.open("image2.png")
x = background.size[0]//2
y = background.size[1]//2
background = Image.alpha_composite(
Image.new("RGBA", background.size),
background.convert('RGBA')
)
background.paste(
foreground,
(x, y),
foreground
)
background.show()
此代码片段是前面答案的混合,将元素与偏移混合,同时处理具有不同尺寸且每个具有透明度的图像。
解决方案 6:
我也遇到过类似的问题,但很难找到答案。以下函数允许您将具有透明度参数的图像粘贴到特定偏移量的另一幅图像上。
import Image
def trans_paste(fg_img,bg_img,alpha=1.0,box=(0,0)):
fg_img_trans = Image.new("RGBA",fg_img.size)
fg_img_trans = Image.blend(fg_img_trans,fg_img,alpha)
bg_img.paste(fg_img_trans,box,fg_img_trans)
return bg_img
bg_img = Image.open("bg.png")
fg_img = Image.open("fg.png")
p = trans_paste(fg_img,bg_img,.7,(250,100))
p.show()
解决方案 7:
def trans_paste(bg_img,fg_img,box=(0,0)):
fg_img_trans = Image.new("RGBA",bg_img.size)
fg_img_trans.paste(fg_img,box,mask=fg_img)
new_img = Image.alpha_composite(bg_img,fg_img_trans)
return new_img
解决方案 8:
关键代码是:
_, _, _, alpha = image_element_copy.split()
image_bg_copy.paste(image_element_copy, box=(x0, y0, x1, y1), mask=alpha)
完整功能如下:
def paste_image(image_bg, image_element, cx, cy, w, h, rotate=0, h_flip=False):
image_bg_copy = image_bg.copy()
image_element_copy = image_element.copy()
image_element_copy = image_element_copy.resize(size=(w, h))
if h_flip:
image_element_copy = image_element_copy.transpose(Image.FLIP_LEFT_RIGHT)
image_element_copy = image_element_copy.rotate(rotate, expand=True)
_, _, _, alpha = image_element_copy.split()
# image_element_copy's width and height will change after rotation
w = image_element_copy.width
h = image_element_copy.height
x0 = cx - w // 2
y0 = cy - h // 2
x1 = x0 + w
y1 = y0 + h
image_bg_copy.paste(image_element_copy, box=(x0, y0, x1, y1), mask=alpha)
return image_bg_copy
上述功能支持:
位置(cx,cy)
自动调整图像元素的大小为 (w, h)
旋转 image_element 但不进行裁剪
水平翻转
解决方案 9:
这是所有当前答案的综合,也是一个可立即使用的代码。
主要答案实际上不起作用,如另一个答案的示例所示:混合方法不正确并且没有产生良好的结果。
正如在另一个答案中所解释的,关键是使用Image.alpha_composite
,但这并不直接允许我们为粘贴的图层设置(x,y)偏移量。
以下是可立即使用的代码:
from PIL import Image
def paste(dest, src, pos):
new_layer = Image.new("RGBA", dest.size)
new_layer.paste(src, pos)
return Image.alpha_composite(dest, new_layer)
layer1 = Image.open("layer1.png").convert("RGBA")
layer2 = Image.open("layer2.png").convert("RGBA") # smaller image, to be pasted
# at position (123, 123)
# layer1.paste(layer2, (123, 123)) # not good
# layer1.save("out1.png")
# layer1.paste(layer2, (123, 123), layer2) # not good either
# layer1.save("out2.png") # (from accepted answer)
out = paste(layer1, layer2, (123, 123)) # works
out.save("out3.png")
- 2025年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)