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

Produce a composed image with different sized layers with transparency

我是 Python 的新手,正在探索使用它来允许用户构建自定义图像。这个想法是客户端会 select 一些选项,然后图像将在服务器上创建然后下载(或用于服务器端的其他事情)。

图片由很多图片组成,大部分是小图标类型的图片,形状不规则,有透明度。所有图层都是 .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()

图像是这样的:

Background.png 是阴影 "noise" 和 Trim.png 是灰色对角线。最棒的是:Trim.png中间透明,可以在中间显示Background.png。但它也和图片一样大。

问题是Fire;注意黑色边框(和奇怪的紫红色点)。文档指出覆盖图像需要具有相同的大小。但这似乎是一种常见的情况,有人想在另一张图片上放置一个较小的透明图标,然后将它们组合成一张图片。

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

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

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

首先,我想说 Johannes Holmberg 已经回答了您的主要问题:缺少透明度。

但我希望能解释一下 奇怪的紫红色圆点:

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

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

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