如何在Pillow中使用alpha_composite?

3
我尝试使用Pillow将透明的Logo放在照片上:
# First, I convert my photo and watermark to RGBA:
image = Image.open(photo_image_path).convert('RGBA')
watermark = Image.open(watermark_image_path).convert('RGBA')

# then I сreate an empty layer with the same size as image
# and put watermark in x/y position
layer = Image.new('RGBA', image.size, (0, 0, 0, 0))
layer.paste(watermark, (x, y))

# then add transparency 
layer.putalpha(128)

# and merge image with logo
result = Image.alpha_composite(image, layer)

一开始我的水印背景是完全透明的。但是我在所有图像尺寸上都得到了一个黑色半透明的背景。我错在哪里了?

3个回答

2
我已经解决了这个问题:

image = Image.open(photo_image_path).convert('RGBA')
watermark = Image.open(watermark_image_path).convert('RGBA')
layer = Image.new('RGBA', image.size, (0, 0, 0, 0))
layer.paste(watermark, (x, y))

# Create a copy of the layer
layer2 = layer.copy()

# Put alpha on the copy
layer2.putalpha(128)

# merge layers with mask
layer.paste(layer2, layer)


result = Image.alpha_composite(image, layer)

1
当你执行layer.putalpha(128)时,你会用"半透明"替换整个叠加层的 alpha 通道,这可能不是你想要的。我猜你想把 alpha 通道乘以一半。可能有更有效的方法来实现这一点(现在我已经暴露了我的无知,肯定会有人来告诉我们两个!),但至少这似乎是有效的:
bands = layer.split()
if len(bands) != 4: raise Exception('Not an RGBA image')
adj_alpha = bands[3].point(lambda x: int(x * 0.5))
layer = image.merge('RGBA', [*bands[:3], adj_alpha])

谢谢!我找到了另一个解决方案,你可以在我的答案中看到它。 - Konstantin Komissarov

0

我的代码样本有5层

生成图片

对于所有图像中的项目:

im1 = Image.open(f'./trait-layers/backgrounds/{background_files[item["Background"]]}.png').convert('RGBA')
im2 = Image.open(f'./trait-layers/shirt/{shirt_files[item["Shirt"]]}.png').convert('RGBA')
im3 = Image.open(f'./trait-layers/face/{face_files[item["Face"]]}.png').convert('RGBA')
im4 = Image.open(f'./trait-layers/eyes/{eyes_files[item["Eyes"]]}.png').convert('RGBA')
im5 = Image.open(f'./trait-layers/hair/{hair_files[item["Hair"]]}.png').convert('RGBA')
im6 = Image.open(f'./trait-layers/thing/{thing_files[item["Thing"]]}.png').convert('RGBA')

#Create each composite
com1 = Image.alpha_composite(im1, im2)
com2 = Image.alpha_composite(com1, im3)
com3 = Image.alpha_composite(com2, im4)
com4 = Image.alpha_composite(com3, im5)
com5 = Image.alpha_composite(com4, im6)



#Convert to RGB
rgb_im = com5.convert('RGB')
file_name = str(item["tokenId"]) + ".png"
rgb_im.save("./images/" + file_name)

1
我们需要更多关于您的解决方案的信息。 - Hamed Baziyad
1
请在您的回答中添加更多细节,例如工作代码或文档引用,以扩展内容。 - Community

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