【问题标题】:Image resizing in .Net with Antialiasing使用抗锯齿在 .Net 中调整图像大小
【发布时间】:2016-12-02 20:20:52
【问题描述】:

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

任何指针?

【问题讨论】:

    标签: .net graphics


    【解决方案1】:

    原来代码是错误的。它实际上是在 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

    谢谢。

    【讨论】:

      【解决方案2】:

      试试 graphics.DrawImage(bmp, 0, 0, width, height); 还要检查这个MSDN Article on interpolation

      【讨论】:

        【解决方案3】:

        抗锯齿与光栅图形无关。它仅适用于矢量图形。显然,图像是光栅图形。

        您需要查看 InterpolationMode。

        【讨论】:

        • 嗨,恕我直言,您对抗锯齿的定义并不完全正确。这不是光栅与矢量图形的区别。
        • 来自 Wikipedia:“在数字信号处理中,抗锯齿是一种在以较低分辨率表示高分辨率信号时最小化被称为混叠的失真伪影的技术。”跨度>
        • 对不起,我在 .Net Graphics.SmoothingMode 的情况下错了。该属性仅与矢量图形相关。
        【解决方案4】:

        问题可能出在其他地方。我使用类似的代码来调整图像大小,它工作正常,但最大的区别是当你保存图像时,你必须指定质量(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);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-11-29
          • 2021-10-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多