使用图像透明度使出现黑色的“东西”

Posted

技术标签:

【中文标题】使用图像透明度使出现黑色的“东西”【英文标题】:Using image transaprency make appear black "things" 【发布时间】:2021-05-13 11:05:27 【问题描述】:

我在使用 Pygame 正确加载和 blit PNG 图像时遇到问题。 代码实际上正在运行,但它在我的精灵周围显示了一些奇怪的黑色“东西”:

black things around my sprite

要加载tileset,我会这样做:

    def TilesRessourceFile(self, filename=None, tileSize=None, tiles=None):
        logging.info("Loading ressources from %s", filename)
        self._tileSize = tileSize

        res = pygame.image.load(filename)
        res.convert_alpha()

        for tile in tiles:
            name, (x, y), alpha = tile.values()
            surface = pygame.Surface((tileSize, tileSize))
            surface.blit(res, (0, 0), area=(x * tileSize, y * tileSize, (x + 1) * tileSize, (y + 1) * tileSize))
            surface.convert_alpha() # set_colorkey(alpha)
            self._tiles.update(name: surface)

然后我像这样对精灵进行blit

    def _implGameObjectRender(self, screen):
    # logging.info("Render map %s", self._mapping)
    for i in range(len(self._mapping)):
        for j in range(len(self._mapping[i])):
            screen.blit(self._mapping[i][j], (j * 128, i * 128))

可能不多,但我自己没有找到解决方案。 我已经尝试过检查:

如何使用 pygame 加载 PNG pygame 的透明度(convert 和 convert_alpha)

我正在使用这个图块集:https://www.gamedevmarket.net/asset/2d-hand-painted-town-tileset-6626/

tileset 提供了一个 json 文件来加载 Tiled。也试过了,效果很好,所以我想问题出在我这边

谢谢你帮助我!

Python 3.9.1 Pygame 2.0.1 (SDL 2.0.14)

【问题讨论】:

【参考方案1】:

convert_alpha() 不会转换表面本身的格式,而是创建一个具有提供每像素 alpha 格式的格式的新表面。

要么

surface = pygame.Surface((tileSize, tileSize))
surface = surface.convert_alpha() 

surface = pygame.Surface((tileSize, tileSize)).convert_alpha() 

有3种方法可以创建一个透明的Surface

set_colorkey()设置透明色键

颜色键指定被视为透明的颜色。例如,如果您有一张应该是透明的黑色背景的图像,请设置黑色键:

surface.set_colorkey((0, 0, 0))

您可以在创建新表面时启用其他功能。设置 SRCALPHA 标志以创建具有包含每像素 alpha 的图像格式的表面。像素的初始值为(0, 0, 0, 0):

surface = pygame.Surface((tileSize, tileSize), pygame.SRCALPHA)

使用convert_alpha() 创建Surface 的副本,其图像格式提供每个像素的 Alpha。

但是,如果您创建一个新表面并使用convert_alpha(),则 Alpha 通道最初会设置为最大值。像素的初始值为 (0, 0, 0, 255)。您需要用透明颜色填充整个表面,然后才能在其上绘制任何内容:

surface = pygame.Surface((tileSize, tileSize))
surface = surface.convert_alpha()
surface.fill((0, 0, 0, 0))

【讨论】:

尝试了您的建议,例如surface = pygame.Surface((tileSize, tileSize)).convert_alpha()。它最终给出了相同的结果。编辑:我取消注释 surface.set_colorkey(alpha) 否则我会在黑色背景上得到精灵 @FebvreAntoine 所以你还没有阅读完整的答案? surface.fill((0, 0, 0, 0)) 呢?或者干脆surface = pygame.Surface((tileSize, tileSize), pygame.SRCALPHA) 对不起,没有看到你更新的答案,会检查这个 我对你的回答投了赞成票,告诉我我需要超过 15 个声望点才能显示它......编辑:它确实说感谢您的反馈!声望低于 15 人的投票将被记录,但不会更改公开显示的帖子得分。编辑 2:你如何将这篇文章标记为 resolvde ? @FebvreAntoine 没有“已解决”状态。但是,您已接受对您的问题的回答。这相当于“已解决”。

以上是关于使用图像透明度使出现黑色的“东西”的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 CSS 为图像添加低调(黑色、透明叠加)效果?

如何使 UITabbar 透明以便超级视图的背景图像可见?

Imagemagick 旋转透明图像上不需要的黑色背景

使用gd在php中调整图像大小后的黑色背景

更改ImageView中黑色像素的不透明度

PyQt5 Python 透明 QWebViewEngine