使用透明度生成具有不同大小的图层的合成图像

时间:2017-02-28 03:30:40

标签: python python-2.7 pillow

我是Python的新手,正在探索允许用户构建自定义图像的用途。我们的想法是客户端会选择一些选项,然后在服务器上创建图像然后下载(或用于服务器端的其他内容)。

图像由许多图像组成,其中大多数是小图标类型的图像,这些图像是不规则形状并具有透明度。所有图层都是.png个文件。

我尝试使用Pillow,但似乎图像需要与整体图像大小相同才能正确使用顶层的透明度。

这是我到目前为止所尝试的内容:

from PIL import Image

background = Image.open("Background.png")
foreground = Image.open("Trim.png")
fire = Image.open("Type_Fire_Large.png")

background = Image.alpha_composite(background, foreground)
background.paste(fire, (150, 150))
background.show()

图片如下所示:

Layered image with black on overlay

Background.png是阴影“噪音”,Trim.png是灰色对角线。最好的部分:Trim.png中心透明,能够在中间显示Background.png。但它的大小也与图像相同。

问题是Fire;请注意黑色边框(和奇数紫红色点)是如何的。文档指出叠加图像需要具有相同的大小。但似乎有人会想要在另一个图像上放置一个透明度较小的小图标并将它们组合成一个图像。

我不依赖于任何特定的图书馆,我对想法和替代方案持开放态度。我唯一想做的就是保持简单,所以创建一个完整的游戏引擎或类似的东西可能会产生太多。

2 个答案:

答案 0 :(得分:4)

要将一个png粘贴到另一个png上,尊重透明度,请尝试

background.paste(fire, (x,y), fire.convert("RGBA"))

答案 1 :(得分:2)

首先我要说Johannes Holmberg已经回答了你的主要担忧:缺少透明度。

但我希望用奇怪的紫红色点来解释它的含义:

透明彩色图像通常存储为RGBA(RGB为红色,绿色,蓝色和A为Alpha)。这里Alpha定义了透明度,从无透明度到完全透明。

以正确的方式覆盖图像我们看到GIMP徽标但颜色条纹几乎是不可见的 - 因为它(几乎)透明。

Using RGBA

但是 - 因为每个像素可能可能可见 - 每个像素仍然有颜色。即使那些100%透明度的像素也是如此。因此,如果我们不考虑Alpha,我们会看到每个像素颜色没有透明度。通过这种方式,我们可能会产生令人不安的颜色,这些颜色通常都不会令人不安 - 只要它们完全透明。

enter image description here