2013-09-27 44 views
0

我正在嘗試將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值。這可能是問題嗎?如果是這樣,我該如何檢查?如果不是,我錯過了什麼?

謝謝!

回答

1

你應該每個像素的阿爾法初始化:

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

相關問題