C#调整索引颜色位图的大小并保持颜色

本文关键字:颜色 调整 索引 位图 | 更新日期: 2023-09-27 18:21:37

我有一个Bitmap,它是256色索引格式的,我需要调整它的大小,所以我创建了一个24位RGB格式的新Bitmap,并使用Graphics对象绘制它,因为我无法从索引的彩色位图创建图形对象。然后我需要将调整大小的图像保存为索引颜色格式,所以我使用FormatConvertedBitmap转换为索引颜色,如下所示:

BitmapSource bitmapSource = Imaging.CreateBitmapSourceFromHBitmap(bmp.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
FormatConvertedBitmap converted = new FormatConvertedBitmap();
converted.BeginInit();
converted.Source = bitmapSource;
converted.DestinationFormat = System.Windows.Media.PixelFormats.Indexed8;
converted.DestinationPalette = new BitmapPalette(bitmapSource, 256);
converted.EndInit();

这是可行的,但纯色现在是颗粒状的,并包含其他颜色的像素。有没有更好的方法来调整索引彩色图像的大小或保持纯色?

C#调整索引颜色位图的大小并保持颜色

是的,这是不可避免的。你想控制的核心属性是Graphics.InterpolationMode。像Bicubic这样的高质量选择会为调整大小的图像添加很多颜色。试图将其恢复到256色会产生颗粒状的图像。您可以使用"最近邻居"来减少添加的颜色数量,但最终会得到块状图像。

你可以试试GIF编码器,它会强制将图像重新采样回256色。它使用抖动算法。但往往会产生斑点状的伪影,当图像有大面积的相似颜色时,这些伪影就会变得明显,比如蓝天。除了不重新采样之外,没有什么神奇的治疗方法。用我们现在拥有的出色硬件做这件事毫无意义。