为什么pygame.surfarray.pixels_alpha会引发ValueError?

问题描述:

我正在尝试将uint8 alpha值(腌渍数组here)的一个numpy数组应用到表面,但我一直得到ValueError: unsupported colormasks for alpha reference array为什么pygame.surfarray.pixels_alpha会引发ValueError?

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文档字符串提到一个32位Surface与每个像素的α值是必需的。我用Surface.get_bitsize检查了表面位的大小,并确认它返回32。这就是说,我不知道如何检查它是否具有每个像素的alpha值。这可能是问题吗?如果是这样,我该如何检查?如果不是,我错过了什么?

谢谢!

你应该每个像素的阿尔法初始化:

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

这不需要初始化显示。


老答案:

你需要它拥有每像素阿尔法,这是不自动即使是32位图像:

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

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

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

你又来了!像魅力一样工作,谢谢!你碰巧知道这个每像素alpha业务究竟是什么? – blz

+1

并不特别。不具有每像素阿尔法允许更快的blits,但我不确定为什么默认情况下使用32位。 //还请注意更新的答案。 – Veedrac

+0

感谢您的更新。这确实简化了很多事情!我现在有另外一个(相关)问题,我已经在一个单独的问题中发布了。如果你有时间,你可以看看吗?谢谢! http://stackoverflow.com/questions/19058022/why-is-surface-unlock-failing-to-unlock-the-surface-for-blitting – blz