如何使用PIL将透明png图像与另一个图像合并

Ara*_*kna 138 python image image-processing python-imaging-library

我有一个透明的png图像"foo.png",我打开了另一个图像

im = Image.open("foo2.png");
Run Code Online (Sandbox Code Playgroud)

现在我需要的是将foo.png与foo2.png合并.

(foo.png包含一些文本,我想在foo2.png上打印该文本)

nos*_*klo 254

import Image

background = Image.open("test1.png")
foreground = Image.open("test2.png")

background.paste(foreground, (0, 0), foreground)
background.show()
Run Code Online (Sandbox Code Playgroud)

第一个参数.paste()是要粘贴的图像.第二个是坐标,秘密酱是第三个参数.它表示将用于粘贴图像的蒙版.如果传递具有透明度的图像,则Alpha通道将用作遮罩.

检查文档.

  • 我得到```ValueError:bad transparency mask``` (12认同)
  • 我错过了秘密酱,谢谢!:d (9认同)
  • 要确保前景在所有情况下都包含透明度,请使用`foreground.convert('RGBA')`作为mask参数. (6认同)
  • 谢谢.我太缺少第三个参数了. (2认同)
  • 秘制酱很美味 (2认同)
  • @DenizOzger要修复`ValueError:不良的透明蒙版',请使用`bg.paste(fg,(0,0),fg.convert('RGBA'))` (2认同)

olt*_*olt 61

Image.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")
Run Code Online (Sandbox Code Playgroud)

编辑:两个图像都必须是RGBA类型.因此,convert('RGBA')如果它们是调色板等,则需要调用.如果背景没有alpha通道,则可以使用常规粘贴方法(应该更快).

  • 我得到```ValueError:图像有错误的模式``` (7认同)
  • 我得到'ValueError:图像有错误的'以及@DenizOzger (4认同)
  • @PeterHansen,当背景图像也包含透明度时,paste()无法按预期工作. (3认同)
  • `ValueError:图像不匹配`。因为此方法仅在图像尺寸相同时有效 (2认同)

P.M*_*lch 41

正如olt已经指出的那样,Image.paste当源目标都包含alpha 时,它无法正常工作.

请考虑以下情形:

两个测试图像,都包含alpha:

在此输入图像描述 在此输入图像描述

layer1 = Image.open("layer1.png")
layer2 = Image.open("layer2.png")
Run Code Online (Sandbox Code Playgroud)

Image.paste像这样合成图像:

final1 = Image.new("RGBA", layer1.size)
final1.paste(layer1, (0,0), layer1)
final1.paste(layer2, (0,0), layer2)
Run Code Online (Sandbox Code Playgroud)

产生下面的图像(重叠的红色像素的alpha部分完全取自第二层.像素未正确混合):

在此输入图像描述

Image.alpha_composite像这样合成图像:

final2 = Image.new("RGBA", layer1.size)
final2 = Image.alpha_composite(final2, layer1)
final2 = Image.alpha_composite(final2, layer2)
Run Code Online (Sandbox Code Playgroud)

生成以下(正确)图像:

在此输入图像描述

  • 谢谢你的截图!真的有帮助! (3认同)
  • 我猜您将不得不创建一个与小工具图像大小相同的新空白图像,将图层粘贴到正确的位置,然后使用alpha_compositing将新图像混合到目标图像上。 (2认同)
  • 图片需要具有相同的尺寸 (2认同)

nvd*_*nvd 10

也可以使用混合:

im1 = Image.open("im1.png")
im2 = Image.open("im2.png")
blended = Image.blend(im1, im2, alpha=0.5)
blended.save("blended.png")
Run Code Online (Sandbox Code Playgroud)

  • 'ValueError:图像不匹配' (2认同)
  • 它们可能具有不同的尺寸。您可能需要缩放或裁剪其中之一。 (2认同)
  • @Schütze查看nvd的评论,因为他/她没有ping(使用@blahblah)您 (2认同)