C#将位图转换为索引颜色格式

如何将24位颜色System.Drawing.Bitmap转换为索引(256色)格式? 我在弄清楚如何计算调色板时遇到了麻烦。 我可以迭代像素并使用int[]来包含各种颜色,但是当有超过256种颜色时会出现问题。 有没有办法转换为索引格式并从Bitmap提取256色调色板?

使用位图克隆方法,您可以直接将源图像转换为256色调色板索引图像,如下所示:

 Bitmap Result = Source.Clone(new Rectangle(0, 0, Source.Width, Source.Height), PixelFormat.Format8bppIndexed); 

然后,如果要访问Palette Colors,只需使用Result.Palette.Entries属性。

我之前遇到过同样的挑战。 可以在.Net中使用GDI +来解决。

这篇文章给了我很多帮助(包括样本): http : //msdn.microsoft.com/en-us/library/Aa479306

为了获得最佳质量,请使用“基于八叉树的量化”。

这不是内置的,但您可以为此使用外部.NET库,也可以在控制台中调用ImageMagic。

一些阅读材料可以帮助您入门。

  • Graphic Gems I pp.287-293,“一种简单的颜色量化方法:八叉树量化”

  • B.库兹。 彩色显示器的最佳颜色量化。 IEEE计算机视觉和模式识别会议论文集,1983年,第217-224页。

  • Graphic Gems II pp.116-125,“高效反色图计算”

本文描述了一种将实际颜色映射到缩小颜色图的有效技术,该颜色图通过其他论文中描述的其他技术选择。

  • Graphic Gems II pp.126-133,“用于最佳颜色量化的高效统计计算”

  • 吴小林 动态规划和主成分分析的颜色量化。 ACM Transactions on Graphics,Vol。 1992年10月11日第4号,第348-372页。

WPF可以访问Windows Imaging Component,您可以使用FormatConvertedBitmap将图像转换为新的像素格式。 WIC比Vista和7上的System.Drawing方法快得多,并且可以为您提供更多选项。