将不同调色板索引分配给图像

3 投票
2 回答
1045 浏览
提问于 2025-04-17 12:15

我正在用Python和Pygame写一个游戏。为了让游戏的画面看起来像老式游戏机(比如NES)的风格,我的图形是由一个包含2位(4种颜色)图像的图块文件组成。我希望在加载这些图像时,可以给它们分配任意的4种颜色的调色板。

我想用一种8位(256种颜色)的调色板模式,并把这个调色板分成64个子调色板,每个子调色板有4种颜色。每次我从这个2位图形文件中加载一个16x16的图块时,我都想给它分配其中一个虚拟的4种颜色的调色板。因此,在原始的图块文件中,调色板的索引是0到3,因为这是一个2位索引的文件。我想把这些图块加载到内存中,并使用一个函数将调色板的索引从0-3重新分配到我选择的调色板偏移量,这样当我把它显示到屏幕上时,就能用我选择的4种颜色来上色——这和NES硬件的工作方式很像。这个过程有点复杂,所以也许这张图能让它更清楚一些:

enter image description here

我查阅了Pygame和PIL的手册,但没有找到可以像这样操作调色板文件的方法。有没有其他的库可以考虑,或者有没有更简单的解决方案我没有想到?

2 个回答

0

你可以使用 pygame.Surface.set_palette_at() 来实现这个功能。在你的情况下,你有四种颜色要为六十四个方块上色,所以如果你想给某个特定的方块换颜色,可以这样做:

for n, newRGBA in enumerate(fourNewColours):  # where fourNewColours are the RGBA tuples you want to plop into the palette.
    GameSurface.set_palette_at(palette_offset + n, newRGBA)  # where palette_offset is the number of the first palette index you want to replace (adding n to increment your way through the new colours).

这就是如何替换四种颜色的单个方块。最开始把每种调色板都放进游戏表面可能会比较复杂,因为 pygame 似乎是通过“近似”来处理图像的调色板,而不是直接替换目标表面的索引。这会比较麻烦,因为我不知道你该如何处理那些有重复索引 RGBA 值的像素。(比如说,如果调色板 14/2 和调色板 40/1 都是 (90,91,200,255),我不确定 pygame 会不会把所有带有这个 RGBA 值的像素都分配给调色板索引 57(来自 Pal14/2),而不分配给索引 160(来自 Pal40/1),或者这两个会不会保持独立。如果你想实时更改图像的颜色,这可能会成为一个问题。如果你选择稍微复杂一点的方法,根据需要调整游戏的调色板,然后再把相关的新调色板应用到表面上,这样应该会更可靠。

希望这些信息对你有帮助(尽管已经过去两年半了)!

如果你想看更详细的版本,可以查看 这个链接。

0

虽然我自己没有这样做过,但我觉得在PyGame中,你要找的这个调用是:http://pygame.org/docs/ref/surface.html#Surface.set_palette

撰写回答