在 ImageSharp 中使用调色板/索引图像

Working with palette / indexed images in ImageSharp

对于传统游戏,我需要加载 BMP(或 PNG)调色板格式的图像,并更改调色板上某些众所周知的索引(例如,使用索引 0-8 的红色渐变替换为绿色阴影,改变单位的颜色)。单独进行颜色替换是不够的,因为相同的颜色可能被多个单元功能使用。

因此是否可以加载调色图像并在 ImageSharp 中保留颜色索引?当我用 Image.Load("FileName") 加载我的调色板单元图像时,它总是以 Argb32 模式加载,并且调色板丢失了。在 Photoshop 中,同一图像在索引模式下正确加载。另外,我不确定我可以将哪些属性用于 see/edit 调色板。

我在网上找不到太多关于该主题的信息。我看到文档中有一个类型 IndexedImageFrame<TPixel>,但我不确定 if/how 该类型是否有助于解决上述问题。

编辑:正如 James South 正确指出的那样,ImageSharp 默认以 Rgba32 模式加载 PNG。

When I load my paletted unit image with Image.Load("FileName"), it is always loaded in Argb32 mode

实际上,如果加载 png,那将是 Rgba32(尽管这可能会在未来发生变化)。为了保证像素格式,您应该使用通用变体。

In Photoshop, the same image is correctly loaded in indexed mode.

PhotoShop 不是这么做的。他们正在捕获调色板并将其显示给您。任何像素格式的实际 canvas 格式都是相同的。

ImageSharp 也是如此。解码图像是 TPixel 的 2D 缓冲区,但我们在解码时捕获元数据并使用它来通知编码器保存哪种像素格式来编码图像。

也就是说...目前恐怕不支持在解码时捕获当前调色板。如果您想在 GitHub repository 中提出问题,我们可能会考虑针对 V2 提出问题。

如果您有要捕获的信息,那么 adjusting/saving 可以在图像编码期间使用带有更新调色板的 PaletteQuantizer。