使用抗锯齿技术在.Net中调整图像大小

10

我有一些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属性好像没有任何影响。

有什么建议吗?

4个回答

21

事实证明代码只是错误的。实际上,在位图构造函数中调整图像大小时没有插值,然后尝试平滑地调整该版本以达到其已经达到的大小。以下是修改后的代码:

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

谢谢。


2

2

抗锯齿与光栅图形无关,只适用于矢量图形。很明显,图像是光栅图形。

您需要查看InterpolationMode。


1
嗨,我个人认为你对抗锯齿的定义并不完全正确。这不是光栅图与矢量图之间的问题。 - Dirk Vollmar
维基百科上的解释是:“在数字信号处理中,抗混叠是一种技术,用于在将高分辨率信号表示为低分辨率时最小化所谓的混叠失真。” - Dirk Vollmar
1
抱歉,在 .Net Graphics.SmoothingMode 的情况下我错了。该属性仅适用于矢量图形。 - Dirk Vollmar

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接