C# - 将图像复制到8位索引图像中

时间:2009-11-19 07:12:57

标签: c# image bitmap

我想从常规的32位Image对象创建一个8位索引图像。

Bitmap img = new Bitmap(imgPath); // 32-bit
Bitmap img8bit = new Bitmap(imgW, imgH, Format8bppIndexed); // 8-bit

// copy img to img8bit -- HOW?

img8bit.Save(imgNewPath, ImageFormat.Png);

我不能使用SetPixel逐像素地复制它,因为图形不适用于索引图像。

怎么回事?

2 个答案:

答案 0 :(得分:5)

我找到了一个C# library,它将位图转换为一个调色板(8位)图像。该技术很快,因为它直接调用GDI32(Windows图形系统)。

要使用灰度调色板转换为8bpp(调色板)图像,请执行

System.Drawing.Bitmap b0 = CopyToBpp(b,8);

如果要转换为具有不同调色板的图像,请查看CopyToBpp源代码中的注释以获取建议。请注意,当您转换为1bpp或8bpp的调色副本时,Windows将逐个查看每个像素,并将选择最接近该像素的调色板条目。根据您的源图像和调色板的选择,您最终可能会得到一个仅使用调色板中可用颜色的一半的结果图像。

答案 1 :(得分:1)

将任意RGBA图像转换为8位索引位图是一项非常重要的操作;你必须做一些数学运算来确定前256种颜色并围绕其余颜色(或做抖动等)。

http://support.microsoft.com/kb/319061除了一个好的算法外,还有一切细节,它应该让你知道如何开始。