使用抗锯齿功能在.Net中调整图像大小

时间:2008-12-02 10:36:46

标签: .net graphics

我有一些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属性的更改似乎没有区别。

任何指针?

5 个答案:

答案 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);