代码之家  ›  专栏  ›  技术社区  ›  Louis Thibault

为什么pygame.surfarry.pixels_alpha抛出ValueError?

  •  0
  • Louis Thibault  · 技术社区  · 12 年前

    我正在尝试应用一个numpy数组 uint8 阿尔法值(腌制数组 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 docstring提到32位 Surface 需要具有每个像素的阿尔法值。我用检查了表面的钻头尺寸 Surface.get_bitsize ,并确认返回 32 也就是说,我不知道如何检查它是否具有每个像素的阿尔法值。这可能是问题所在吗?如果是,我该如何检查?如果没有,我错过了什么?

    非常感谢。

    1 回复  |  直到 12 年前
        1
  •  1
  •   Veedrac    12 年前

    您应该使用每像素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))