我有一张透明的png图片foo.png
,我使用以下代码打开了另一张图片:
im = Image.open("foo2.png")
现在我需要将foo.png
和foo2.png
合并。
(foo.png
包含一些文本,我希望将该文本打印在foo2.png
上)
我有一张透明的png图片foo.png
,我使用以下代码打开了另一张图片:
im = Image.open("foo2.png")
现在我需要将foo.png
和foo2.png
合并。
(foo.png
包含一些文本,我希望将该文本打印在foo2.png
上)
from PIL import Image
background = Image.open("test1.png")
foreground = Image.open("test2.png")
background.paste(foreground, (0, 0), foreground)
background.show()
.paste()
的第一个参数是要粘贴的图像,第二个是坐标,而秘密酱是第三个参数。它指示将用于粘贴图像的掩码。如果传递具有透明度的图像,则使用alpha通道作为掩码。
请查阅文档。
foreground.convert('RGBA')
作为遮罩参数。 - Mark RansomImage.paste
在背景图像包含透明度时的效果不如预期。您需要使用真正的Alpha Compositing。
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通道,则可以使用常规的paste方法(这应该更快)。
正如 olt 已经指出的那样,当源和目标都包含alpha通道时,Image.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)
使用Image.alpha_composite
合成图像,会产生以下图像(红色覆盖的部分完全来自第二层的 alpha 通道。像素没有被正确混合):
示例代码如下:
final2 = Image.new("RGBA", layer1.size)
final2 = Image.alpha_composite(final2, layer1)
final2 = Image.alpha_composite(final2, layer2)
生成以下(正确的)图像:
alpha_composite
无法设置偏移量,您介意给出一个完全替换 paste
函数的示例吗? - Mithril还可以使用混合:
im1 = Image.open("im1.png")
im2 = Image.open("im2.png")
blended = Image.blend(im1, im2, alpha=0.5)
blended.save("blended.png")
cloud_as_img.convert("RGBA") cloud_as_img.putalpha(255) cloud_as_img.save(temp_file_name)
- Jordan The Genius这是我的代码,用于合并两张不同大小的图片,每张图片都有透明度和偏移量:
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()
这段代码混合了之前的答案,将具有偏移量的元素与处理具有不同尺寸并带有透明度的图像相结合。
我曾经有类似的问题,并且很难找到答案。下面的函数允许您在特定偏移量处粘贴具有透明度参数的图像覆盖另一张图像。
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()
ValueError: images do not match
- llllllllllllldef 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
the key code is:
_, _, _, 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
上述函数支持以下功能:
;
:它很丑陋。 - nosklo