You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ImageSharp中处理调色板/索引图像并修改调色板索引?

ImageSharp加载索引调色板图像并修改调色板的实现方法

完全可以在加载时保留原始索引和调色板,ImageSharp默认自动转Rgba32的行为可以通过显式配置覆盖。

1. 加载时保留索引格式的方法

不要直接用无泛型的Image.Load方法,需要显式指定索引像素类型,并配置对应格式的解码器禁用自动色彩转换:

  • 对应不同调色板位深选择像素类型:
    • 1位调色板:Indexed1
    • 4位调色板:Indexed4
    • 8位调色板:Indexed8(最常见)
    • 16位调色板:Indexed16

示例加载代码:

using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Formats.Png;
using SixLabors.ImageSharp.Formats.Bmp;
using SixLabors.ImageSharp.PixelFormats;

// 加载PNG索引图像
var pngDecoder = new PngDecoder
{
    // 禁止自动将透明色转换为ARGB格式
    SuppressTransparentColorConversion = true
};
// 替换为你的实际位深对应的像素类型,这里以常用的8位索引为例
using var image = Image.Load<Indexed8>("你的图像路径.png", pngDecoder);

// 加载BMP索引图像同理
var bmpDecoder = new BmpDecoder
{
    SuppressTransparentColorConversion = true
};
using var bmpImage = Image.Load<Indexed8>("你的图像路径.bmp", bmpDecoder);

2. 查看与修改调色板

加载完成后,直接访问帧的Palette属性即可操作调色板,你要的将索引0-8的红色渐变替换为绿色渐变的需求可以直接这么实现:

// 获取第一帧的调色板(单帧图像直接取索引0即可)
var palette = image.Frames[0].Palette;

// 替换索引0-8的颜色为绿色渐变,步长可根据需求调整
for (int i = 0; i <= 8; i++)
{
    // 示例:绿色分量随索引递增,红、蓝分量为0
    palette[i] = Color.FromRgb(0, (byte)(i * 30), 0);
}

如果需要直接修改单个像素的索引值,可以将帧转换为IndexedImageFrame<TPixel>类型操作:

var frame = image.Frames[0] as IndexedImageFrame<Indexed8>;
// 将坐标(10,10)的像素索引设置为5
frame[10, 10] = 5;

3. 保存修改后的图像

直接调用Save方法即可,编码器会自动保留索引格式输出:

image.Save("修改后的图像.png");

注意事项

  • 如果加载时报像素格式不匹配错误,检查你的图像实际调色板位深,替换为对应的Indexed*像素类型即可。
  • 不要在处理过程中调用任何自动转换像素格式的处理方法,否则会丢失索引和调色板信息。

内容的提问来源于stack exchange,提问作者micTronic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 15:09:05