索引表面是否支持具有 alpha 值(255 除外)的调色板?
Do indexed Surfaces support palettes with alpha values (other than 255)?
当我调用 myIndexedSurface.get_palette()
时,它 returns 一个 32 位 RGBA 值的列表。我想因为包含了一个 alpha 值,所以我也可以设置和使用具有透明效果的调色板索引。然后,与具有全深度(32 位)每像素数据的表面相比,这些表面可以更有效地作为叠加层或掩码进行 blit。
不过,到目前为止,调色板元素的 alpha 值似乎锁定在 255
,并且不会通过我尝试过的任何方法进行更改:
.set_palette_at(idx, (r,g,b,A))
正确设置 r
、g
和 b
,但将 alpha 值保留为 255,而不管 A
的价值。
.set_palette(somePalette)
如果任何 somePalette
RGBA 元组元素的 alpha 值不是 255,则引发 ValueError: takes an alpha value of 255
。
我想做的事情可行吗?每个调色板列表元素中的 alpha 值是否纯粹是装饰性的,它可能更容易被其他需要 32 位 (RGBA) 像素数据而不是 24 位 (RGB) 像素数据的进程使用?
我觉得 Pygame 中的索引表面可能无法从一开始就处理这种复杂程度,但我也想不出或找不到它 不应该的原因t。也许 Pygame 有一个神秘的 special_flags
用于此目的?
我已经尝试通过 myIndexedSurface = pygame.Surface(surfSize).convert(8)
和 myIndexedSurface = pygame.Surface(surfSize, flags=pygame.SRCALPHA).convert(8)
初始化 Surface 本身,但没有效果。
我还没有查看 PIL or Pygame's PixelArray
的解决方案。
正如您亲眼所见,事实并非如此。您所描述的是一种新发明的方法。有四个值只是因为它在 pyGame 中声明了颜色值和其他一些属性。例如,如果你试试这个
S = pygame.Surface ((w,h),0,24)
r,g,b,a =S.get_masks()
你会看到四个值的元组,尽管 24 位表面显然只有三个字节要处理,所以 alpha 不会通过进一步的 blitting 发挥作用。如果你后端的数据最初是索引的,比如数字数组,我个人也会在后端描述组合逻辑,使用掩码数组。
当我调用 myIndexedSurface.get_palette()
时,它 returns 一个 32 位 RGBA 值的列表。我想因为包含了一个 alpha 值,所以我也可以设置和使用具有透明效果的调色板索引。然后,与具有全深度(32 位)每像素数据的表面相比,这些表面可以更有效地作为叠加层或掩码进行 blit。
不过,到目前为止,调色板元素的 alpha 值似乎锁定在 255
,并且不会通过我尝试过的任何方法进行更改:
.set_palette_at(idx, (r,g,b,A))
正确设置r
、g
和b
,但将 alpha 值保留为 255,而不管A
的价值。.set_palette(somePalette)
如果任何somePalette
RGBA 元组元素的 alpha 值不是 255,则引发ValueError: takes an alpha value of 255
。
我想做的事情可行吗?每个调色板列表元素中的 alpha 值是否纯粹是装饰性的,它可能更容易被其他需要 32 位 (RGBA) 像素数据而不是 24 位 (RGB) 像素数据的进程使用?
我觉得 Pygame 中的索引表面可能无法从一开始就处理这种复杂程度,但我也想不出或找不到它 不应该的原因t。也许 Pygame 有一个神秘的 special_flags
用于此目的?
我已经尝试通过 myIndexedSurface = pygame.Surface(surfSize).convert(8)
和 myIndexedSurface = pygame.Surface(surfSize, flags=pygame.SRCALPHA).convert(8)
初始化 Surface 本身,但没有效果。
我还没有查看 PIL or Pygame's PixelArray
的解决方案。
正如您亲眼所见,事实并非如此。您所描述的是一种新发明的方法。有四个值只是因为它在 pyGame 中声明了颜色值和其他一些属性。例如,如果你试试这个
S = pygame.Surface ((w,h),0,24)
r,g,b,a =S.get_masks()
你会看到四个值的元组,尽管 24 位表面显然只有三个字节要处理,所以 alpha 不会通过进一步的 blitting 发挥作用。如果你后端的数据最初是索引的,比如数字数组,我个人也会在后端描述组合逻辑,使用掩码数组。