2012-01-28 104 views
0

我有一个Bitmap这是256色索引的格式,我需要调整,所以我创建一个新的Bitmap 24位RGB格式,并使用Graphics对象为我绘制无法从索引的颜色位图创建图形对象。然后我需要保存调整后的图像回为索引颜色格式,所以我用FormatConvertedBitmap转换为索引颜色是这样的:C#调整索引色位,并保持颜色

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(); 

这个工作,但是纯色现在颗粒感和含有其他颜色的像素。是否有更好的方法来调整索引的彩色图像的大小或保持纯色?

回答

1

是的,这是相当不可避免的。要控制影响的核心属性是Graphics.InterpolationMode。像Bicubic这样的高品质选择会为调整大小的图像添加许多颜色。试图将其重新分成256种颜色会产生粒状图像。您可以使用NearestNeighbor来减少添加的颜色数量,但最终会显示块状图像。

您可以尝试使用GIF编码器,它也被迫将图像重新采样回256色。它使用抖动算法。但是当图像具有相似颜色的大面积时(如蓝天),往往会产生斑点状的文物。除了简单的不重新采样以外,没有什么神奇的治疗方法。用这些天我们拥有的精美硬件来做这件事毫无意义。