我有一些C#代码调整了我认为非常典型的图像大小:
Bitmap bmp = new Bitmap(image, new Size(width, height));
Graphics graphics = Graphics.FromImage(bmp);
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.SmoothingMode = SmoothingMode.AntiAlias;
graphics.DrawImage(bmp, width, height);
问题是结果图像明显有别名,而对InterpolationMode和SmoothingMode属性的更改似乎没有区别。
任何指针?
答案 0 :(得分:18)
它变成了代码错误。它实际上是在Bitmap构造函数中没有插值的情况下调整图像大小,然后尝试将该版本平滑地调整到它已经存在的大小。这是修改后的代码:
Bitmap bmp = new Bitmap(width, height);
Graphics graph = Graphics.FromImage(bmp);
graph.InterpolationMode = InterpolationMode.High;
graph.CompositingQuality = CompositingQuality.HighQuality;
graph.SmoothingMode = SmoothingMode.AntiAlias;
graph.DrawImage(image, new Rectangle(0, 0, width, height));
就抗锯齿而言,最重要的参数是graph.InterpolationMode
。
感谢。
答案 1 :(得分:2)
尝试graphics.DrawImage(bmp,0,0,width,height); 另请查看MSDN Article on interpolation。
答案 2 :(得分:2)
消除锯齿与光栅图形无关。它仅适用于矢量图形。显然,图像是光栅图形。
您需要查看InterpolationMode。
答案 3 :(得分:0)
有一篇关于CodeProject的文章描述了一种改进的抗锯齿方法:
http://www.codeproject.com/KB/GDI-plus/AntiAliasingIssues.aspx
答案 4 :(得分:0)
问题可能是另一个地方。我使用类似的代码来调整图像大小,它可以正常工作,但最大的区别是,当你保存图像时,你必须指定质量(jpeg):
ImageCodecInfo[] codecs=ImageCodecInfo.GetImageEncoders();
ImageCodecInfo codec = null;
for (int i = 0; i<codecs.Length;i++)
{
if(codecs[i].MimeType.Equals("image/jpeg"))
codec = codecs[i];
}
EncoderParameters encoderParametersInstance = null;
if (codec!=null)
{
Encoder encoderInstance=Encoder.Quality;
encoderParametersInstance = new EncoderParameters(2);
//100% quality, try different values, around 80-90 gives good results.
EncoderParameter encoderParameterInstance=new EncoderParameter(encoderInstance, 100L);
encoderParametersInstance.Param[0]=encoderParameterInstance;
encoderInstance=Encoder.ColorDepth;
encoderParameterInstance=new EncoderParameter(encoderInstance, 24L);
encoderParametersInstance.Param[1]=encoderParameterInstance;
}
MemoryStream ms = new MemoryStream();
resizedImage.Save(ms, codec, encoderParametersInstance);