索引曲面是否支持具有 alpha 值(255 以外的)的调色板



当我调用myIndexedSurface.get_palette()时,它返回一个32位RGBA值的列表。我想,因为包含一个 alpha 值,所以我也可以设置和使用具有透明效果的调色板索引。然后,这些表面可以作为叠加层或蒙版进行块状处理,比具有全深度(32 位(每像素数据的表面更有效。

不过,到目前为止,调色板元素 alpha 值似乎锁定在255,并且不会通过我尝试过的任何方法进行更改:

  • .set_palette_at(idx, (r,g,b,A))正确地设置了rgb,但不管A的值如何,alpha 值都保持在 255。

  • 如果 RGBA 元组元素somePalette alpha 值不是 255,.set_palette(somePalette)将引发ValueError: takes an alpha value of 255

我正在尝试做的事情可能吗?每个调色板列表元素中的 alpha 值是否纯粹是装饰性的,以便其他需要 32 位 (RGBA( 像素数据而不仅仅是 24 (RGB( 像素数据的进程更容易使用它?

我觉得 Pygame 中的索引表面一开始可能就无法处理这种程度的复杂性,但我也无法想到或找到为什么不应该这样做的原因。也许Pygame有一个神秘的special_flags来达到这个目的?

我尝试通过myIndexedSurface = pygame.Surface(surfSize).convert(8)初始化 Surface 本身,myIndexedSurface = pygame.Surface(surfSize, flags=pygame.SRCALPHA).convert(8)没有效果。

我还没有看过PIL或Pygame的解决方案PixelArray

正如你自己看到的,它没有。你描述的是一种新发明的方法。之所以有四个值,只是因为它在 pyGame 中声明了颜色值和其他一些属性。例如,如果您尝试此操作

S = pygame.Surface ((w,h),0,24)
r,g,b,a =S.get_masks()

您将看到四个值的元组,尽管 24 位表面显然只有三个字节需要处理,因此 alpha 不会通过进一步的块传输发挥作用。如果后端的数据最初是索引的,例如数字数组,我个人也会使用掩码数组来描述后端的组合逻辑。

最新更新