【问题标题】:pygame.display.set_icon() not handling transparency too wellpygame.display.set_icon() 不能很好地处理透明度
【发布时间】:2017-03-29 10:10:47
【问题描述】:

是的,我知道还有另一篇帖子问这个问题,但我尝试了那个答案,但没有奏效,只会让情况变得更糟。以下是我尝试过的所有帖子:

PyGame: Applying transparency to an image with alpha?

Pygame.display.set_icon unable to show transparecy

How do I set a transparent icon?

我尝试使用透明度的结果与他们完全不同。这是我的代码:

import pygame

pygame.init()

screen = pygame.display.set_mode((800,600))
pygame.display.set_caption("Undertale")
pygame.display.set_icon(pygame.image.load("icon.png").convert_alpha())

结果如下:

这是原图:

有什么帮助吗?

编辑:我按照@user2588654 所说的做了:

鉴于上述情况,我的建议是尝试在 32x32 像素的情况下使用不透明的白色背景重新制作心脏并应用颜色键。让我知道这是否有帮助!

这是我的代码:

import pygame

pygame.init()

screen = pygame.display.set_mode((800,600))
pygame.display.set_caption("Undertale")
icon = pygame.image.load("icon.png")
icon.set_colorkey((0,255,0))
pygame.display.set_icon(icon)

这是新的icon.png:

结果如下:

虽然不多,但还是有点烦人。如果无法修复,那很好,如果是,那么我想知道它。

【问题讨论】:

标签: python transparency


【解决方案1】:

您的代码很好。当我使用您的测试心脏图像运行它时,我在命令提示符中收到以下测试警告:libpng warning: iCCP: known incorrect sRGB profile。按照here 的建议,我使用 image magick 对其进行了转换,并且消除了错误,但它看起来仍然像您的屏幕截图,所以这可能不太重要。

根据here for pygame.display.set_icon() 上的 pygame 文档,看起来大多数系统都需要 32x32 像素左右的较小图像。将图像调整到该尺寸会消除图像上的大部分伪影,但这并不理想,因为您的心脏是大约 20x20 像素的像素艺术。此外,看起来 pygame 中的图标不支持完全透明,而只支持 colorkey。也就是说,您基本上可以通过调用surf.set_colorkey((255, 255, 255)) 来选择一种颜色来设置为完全透明,其中surf 指的是pygame.image.load("icon.png").convert_alpha() 之后的图标图像表面。在我的示例中,元组 (255, 255, 255) 指的是白色。

鉴于上述情况,我的建议是尝试在 32x32 像素的情况下使用不透明的白色背景重新制作心脏并应用颜色键。让我知道这是否有帮助!

【讨论】:

  • 确实有帮助,但还是有点小问题。正如我在帖子中所说,如果没有修复,那很好,但如果有,我想知道。
  • 查看您问题中的结果,看起来 pygame 正在线性插值相邻像素的 RGB 值,从而产生那些黑点。查看文档后,不幸的是我不确定如何禁用它。
  • 我想你可以用来缓解这个问题的一个想法是通过在你的心脏边界上添加深红色像素来为你的绘图添加“抗锯齿”,使其更平滑。它仍然不能真正解决问题,但会使大的黑色像素稍微不那么明显。不过这真的很令人沮丧……
  • 好的,谢谢。抱歉让您久等了回复。我就不管它了,因为它不再那么麻烦了。感谢您的回复!
【解决方案2】:

我在 Windows 上遇到了类似的问题:我试图使用具有透明度的 80x80 PNG 图像作为我的图标。

我尝试了 CodeSurgeon 的回答中的建议,发现 colorkey 透明度实际上并没有使 Windows 10 任务栏中的图标背景透明。

经过一些试验,我发现我需要做的就是:

icon = pygame.image.load(ICON_FILENAME)
icon = pygame.transform.smoothscale(icon, (96, 96))
pygame.display.set_icon(icon)

也就是说,我只需将图像调整为允许的 Windows 图标大小。我不需要将我的图像转换为具有色键背景。

【讨论】:

    猜你喜欢
    • 2014-11-05
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    相关资源
    最近更新 更多