【问题标题】:How do I make the background of an image, that is pasted on top of another image, transparent in pillow?如何使粘贴在另一个图像顶部的图像背景在枕头中透明?
【发布时间】:2020-12-13 21:31:32
【问题描述】:

我正在制作一个国际象棋机器人,它将在聊天程序中运行,根据用户的命令做出反应和移动棋子。因此,我正在尝试使用 python 包枕头将棋子的 png 图像粘贴到棋盘的 png 背景图像之上。

在任何其他软件中,棋子的背景都是透明的,它们后面的任何东西都会显示出来,但是当我使用枕头将其粘贴到棋盘顶部时,棋子的背景是灰色的,与棋盘上的瓷砖不匹配.

有没有一种方法可以将棋子图像粘贴到我的棋盘背景之上,而无需添加棋子的灰色背景颜色?或者在 python 中是否有另一种方法可以提供所需的结果?

我还没有完成机器人和游戏逻辑,但作为示例,我包含了一些代码,说明了我如何将一张图片粘贴到下面的另一张图片之上:

from PIL import Image

board = Image.open('assets/chessboard.png')
w_pawn = Image.open('assets/w_pawn_png_shadow_128px.png')

a_eight = (102, 30, 210, 158)  # Left, top, right and bottom coordinates of where the piece is pasted onto the board

battle_board = board.copy()
battle_board.paste(w_pawn, a_eight)
battle_board.show()

为了快速显示输出的样子,我附上了一张当棋子粘贴到棋盘上时的截图:

A white pawn in A8 with faulty background colour

【问题讨论】:

  • 我认为你需要使用Image.alpha_composite() 来获得你想要的效果。在我曾经写过的this answer 中,有一个使用它在图像顶部绘制形状的示例 - 但这是相同的想法。
  • 这里是another answer,展示了alpha_composite()函数的使用。
  • 谢谢,我需要一些时间来正确理解这一点,但乍一看,这看起来很有希望。
  • 如果你edit你的问题并添加一些链接到所涉及的两个图像,我也许可以发布一个可运行的答案......
  • 哦,不错。这些有帮助吗?

标签: python python-imaging-library


【解决方案1】:

好的,下面是使用我在 cmets 中推荐的 PIL.Image.alpha_composite() PIL Image 类静态函数的方法。它执行称为alpha compositing 的图像处理操作。

更新:我发现还有一个Image.alpha_composite() 方法可以执行类似的操作,但它是“就地”执行的——这可能会提供更好的性能(尽管当前的文档说目前并非如此)。因为这在未来可能会发生变化,所以我修改了显示的代码以利用它来利用未来可能发生的变化。

由于没有alpha_composite_paste() 函数,因此必须首先创建一个与背景棋盘图像相同大小的图像,并具有完全透明的背景。然后将棋子粘贴到所需位置。

所有这些都完成后,您现在就有了两个相同大小的图像——按照alpha_composite() 的要求——然后应用合成……过程的最后一步。

from PIL import Image

# Two RGBA images.
board = Image.open('chessboard.png')
w_pawn = Image.open('w_pawn_png_shadow_128px.png')

a_eight = (102, 30, 210, 158)  # Left, top, right and bottom coordinates of where
                               # the piece is pasted onto the board

battle_board = board.copy()

# First make a fully transparent image the same size as the chessboard image.
tmp_img = Image.new('RGBA', battle_board.size, color=(0,0,0,0))
tmp_img.paste(w_pawn, box=a_eight)  # Paste chess-piece on it at desired posn.
battle_board.alpha_composite(tmp_img)  # Composite tmp_img onto board img "in-place".
battle_board.show()  # TaDa!

结果如下:

【讨论】:

  • 嘿,抱歉消失了一段时间,我的 wifi 昨晚停止工作,我无法重新连接。不过这看起来很棒!非常感谢你做的这些!我也学到了很多,这总是好的。
  • 想知道……但想通这只是暂时的缺席。事实证明,延迟让我有时间改进答案中的代码。
  • 那么有一线希望。您的解决方案效果很好,我非常感激!
  • FWIW,在我的another answer 的一个相关问题中,有一个广义的alpha_composite_paste() 函数的定义,它使用了与此相同的技术。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-28
  • 2019-09-02
  • 2021-05-26
  • 2020-07-12
  • 2017-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多