Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#调整索引颜色位图的大小并保持颜色_C#_.net_Windows_Gdi+ - Fatal编程技术网

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

C#调整索引颜色位图的大小并保持颜色,c#,.net,windows,gdi+,C#,.net,Windows,Gdi+,我有一个256色索引格式的位图,我需要调整它的大小,以便以24位RGB格式创建一个新的位图,并使用图形对象绘制它,因为我无法从索引的彩色位图创建图形对象。然后,我需要将已调整大小的图像保存回索引颜色格式,以便使用FormatConvertedBitmap将其转换为索引颜色,如下所示: BitmapSource bitmapSource = Imaging.CreateBitmapSourceFromHBitmap(bmp.GetHbitmap(), IntPtr.Zero, Int32Rect.

我有一个256色索引格式的
位图
,我需要调整它的大小,以便以24位RGB格式创建一个新的
位图
,并使用
图形
对象绘制它,因为我无法从索引的彩色位图创建图形对象。然后,我需要将已调整大小的图像保存回索引颜色格式,以便使用
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();

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

是的,这是不可避免的。要控制以影响这一点的核心属性是Graphics.InterpolationMode。高质量的选择(如双三次选择)将为调整大小的图像添加大量颜色。尝试将其重回256色将产生颗粒状图像。您可以使用NearestNeighbor来减少添加颜色的数量,但最终会得到块状图像

您可以尝试使用GIF编码器,它也会强制将图像重新采样回256色。它使用抖动算法。但是,当图像具有类似颜色的大面积区域(如蓝天)时,往往会产生斑点状伪影,变得很明显。除了不重新取样之外,没有什么神奇的治疗方法。用我们这些天拥有的优秀硬件做这件事毫无意义