【问题标题】:Why is pygame.surfarray.pixels_alpha throwing a ValueError?为什么 pygame.surfarray.pixels_alpha 会抛出 ValueError?
【发布时间】:2013-09-27 18:26:03
【问题描述】:

我正在尝试将 uint8 alpha 值的 numpy 数组(腌制数组 here)应用于表面,但我不断收到 ValueError: unsupported colormasks for alpha reference array

s = pygame.Surface((100, 100))
s.fill((126, 126, 126))  # make it grey
pxa = pg.surfarray.pixels_alpha(s)

这是完整的回溯:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-81-8c19259f8aa5> in <module>()
----> 1 pxa = pg.surfarray.pixels_alpha(s)

/usr/lib/python2.7/dist-packages/pygame/surfarray.pyc in pixels_alpha(surface)
    206         return numericsf.pixels_alpha (surface)
    207     elif __arraytype == "numpy":
--> 208         return numpysf.pixels_alpha (surface)
    209     raise NotImplementedError("surface arrays are not supported")
    210 

/usr/lib/python2.7/dist-packages/pygame/_numpysurfarray.pyc in pixels_alpha(surface)
    295         start = 3
    296     else:
--> 297         raise ValueError("unsupported colormasks for alpha reference array")
    298 
    299     array = numpy.ndarray \

ValueError: unsupported colormasks for alpha reference array

pixels_alpha 文档字符串提到需要具有每像素 alpha 值的 32 位 Surface。我用Surface.get_bitsize 检查了表面位大小,并确认它返回32。话虽如此,我不知道如何检查它是否具有每个像素的 alpha 值。这可能是问题吗?如果是这样,我该如何检查?如果没有,我错过了什么?

谢谢!

【问题讨论】:

    标签: python pygame alpha


    【解决方案1】:

    您应该使用每像素 alpha 进行初始化:

    surface = pygame.Surface((100, 100), flags=pygame.SRCALPHA)
    

    这不需要初始化显示。


    旧答案:

    您需要它具有每像素 alpha,即使对于 32 位图像也不是自动的:

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

    要使用 convert_alpha,您需要初始化显示:

    pygame.display.set_mode((X, Y))
    

    【讨论】:

    • 你又来了!像魅力一样工作,谢谢!你碰巧知道这个逐像素的 alpha 业务到底是关于什么的吗?
    • 不是特别的。没有每像素 alpha 允许更快的 blits,但我不确定为什么在这种情况下默认使用 32 位。 // 还要注意更新后的答案。
    • 感谢您的更新。这确实简化了很多事情!我现在有另一个(相关)问题,我已经在一个单独的问题中发布了。如果你有时间,请你看看它吗?谢谢! stackoverflow.com/questions/19058022/…
    猜你喜欢
    • 1970-01-01
    • 2022-07-15
    • 1970-01-01
    • 2021-04-05
    • 2018-01-03
    • 2019-04-22
    • 2021-12-20
    • 2021-03-05
    • 2021-03-19
    相关资源
    最近更新 更多