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

C#-将图像复制到8位索引图像中,c#,image,bitmap,C#,Image,Bitmap,我想从常规32位图像对象创建一个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逐像素复制它,因为图形无法处理索引图像 不然呢

我想从常规32位图像对象创建一个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逐像素复制它,因为图形无法处理索引图像


不然呢

将任意RGBA图像转换为8位索引位图是一项非常重要的操作;你必须做一些数学来确定最上面的256种颜色,然后对其余的颜色进行取整(或者做抖动,等等)

除了一个好的算法外,它还提供了所有细节,应该可以让您了解如何开始。

我找到了一个将位图转换为调色板(8位)图像的方法。这种技术很快,因为它直接调用GDI32(windows图形系统)

要转换为具有灰度调色板的8bpp(调色板化)图像,请执行以下操作

System.Drawing.Bitmap b0 = CopyToBpp(b,8);
如果要转换为具有不同调色板的图像,请查看CopyToBpp源代码中的注释以获取建议。请注意,当您转换为1bpp或8bpp调色板副本时,Windows将逐个查看每个像素,并选择最接近该像素的调色板条目。根据您的源图像和调色板的选择,最终生成的图像可能只使用调色板中可用颜色的一半