代码之家  ›  专栏  ›  技术社区  ›  Claudio Redi

调整图像大小的最佳选项

  •  0
  • Claudio Redi  · 技术社区  · 14 年前

    我调整图像的大小超过了最大值。到目前为止我尝试的方法还不够好:-(

    1. System.Drawing.Image.GetThumbnailImage 通常会生成质量非常差的图像。
    2. 使用这样的选项 one 我可以生成质量更好但比原始图像重的图像。

    可能第二个选项(或类似的选项)是最佳选项,我需要使用适当的选项调整大小。

    有什么建议吗?

    编辑
    我的选项2是为某些特定的图片生成较重的图像。总的来说,一切都按预期进行,所以我认为这是解决了。

    3 回复  |  直到 14 年前
        1
  •  3
  •   D'Arcy Rittich    14 年前

    尝试如下操作:

    public Bitmap Resize(Bitmap originalImage, int newWidth)
    {
        int newHeight = (int)Math.Round(originalImage.Height * (decimal)newWidth / originalImage.Width, 0);
        var destination = new Bitmap(newWidth, newHeight);
        using (Graphics g = Graphics.FromImage(destination))
        {
            g.SmoothingMode = SmoothingMode.AntiAlias;
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;
            g.PixelOffsetMode = PixelOffsetMode.HighQuality;
            g.DrawImage(originalImage, 0, 0, newWidth, newHeight);
        }
        return destination;
    }
    
        2
  •  3
  •   Mikael Svenson    14 年前

    我会使用wpf libs而不是gdi+libs。wpf libs的运行速度更快,我认为它们比gdi+libs产生更好的结果。

    看看伯特兰·勒罗伊的这些优秀文章。

        3
  •  2
  •   Aren    14 年前

    创建新的 Bitmap 对象,然后使用 Graphics 对象,根据所需的调整大小引擎,以增大/减小的大小将旧图像重新绘制到新图像的缓冲区中。

    // inImage is your original
    Bitmap outImage = new Bitmap(newWid, newHei);
    
    Graphics gfx = Graphics.FromImage(outImage);
    gfx.InterpolationMode = InterpolationMode.HighQualityBicubic;
    
    gfx.DrawImage(inImage,
       new Rectangle(0, 0, newWid, new Hei),
       new Rectangle(0, 0, inImage.Width, inImage.Height),
       GraphicsUnit.Pixel);