使用C#调整图像大小

问题描述 投票:0回答:4

从数码相机中新鲜出来的图像通常大小超过 2-3 MB,因此很难通过电子邮件和其他方式传输。 这需要调整图像的大小(根据文件大小而不是高度或宽度)。与提供图像大小调整功能的 MS Paint 非常相似。 我对图像文件理论没有受过很好的教育。如果有人能给我指出以下信息来源,我将不胜感激:

  • 图像理论(各种图像格式如何工作,jpeg、png、tiff 等)。?

  • 调整大小时图像如何失去清晰度?有吗

  • 是否有任何免费的.Net(我使用4.0)库可用于执行此操作?如果没有,我可以使用任何具有 com 互操作性的库吗?

非常感谢,

c#-4.0 png jpeg gif tiff
4个回答
40
投票

图像调整大小功能直接内置于 .NET 框架中。有几种不同的方法:

  • GDI+
  • WIC
  • WPF

这是一篇不错的博客文章,涵盖了它们之间的差异。

这是一个使用 GDI+ 的示例:

public void Resize(string imageFile, string outputFile, double scaleFactor)
{
    using (var srcImage = Image.FromFile(imageFile))
    {
        var newWidth = (int)(srcImage.Width * scaleFactor);
        var newHeight = (int)(srcImage.Height * scaleFactor);
        using (var newImage = new Bitmap(newWidth, newHeight))
        using (var graphics = Graphics.FromImage(newImage))
        {
            graphics.SmoothingMode = SmoothingMode.AntiAlias;
            graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
            graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
            graphics.DrawImage(srcImage, new Rectangle(0, 0, newWidth, newHeight));
            newImage.Save(outputFile);
        }
    }
}

11
投票

我使用了 Darin Dimitrov 提供的示例, 图像膨胀并占用了大量磁盘空间(从 1.5MB 到 17MB 左右)。

这是由于最后一行代码中的一个小错误造成的。

下面的函数会将图像保存为位图(大图像尺寸)。

newImage.Save(outputFile)

正确的函数应该是:

newImage.Save(outputFile, ImageFormat.Jpeg);

1
投票

Imageresizer 效果很好。 http://imageresizing.net/


0
投票

我对上面的代码做了一个小小的更改,以便它也可以处理透明度。

 public void Resize(string imageFile, string outputFile, int intNewWidth, int intNewHeight)
    {
        using (var srcImage = System.Drawing.Image.FromFile(imageFile))
        {
            var newWidth = (int)intNewWidth;
            var newHeight = (int)intNewHeight;
            using (var newImage = new Bitmap(newWidth, newHeight)) 
            {
                using (var graphics = Graphics.FromImage(newImage))
                {
                    graphics.SmoothingMode = SmoothingMode.AntiAlias;
                    graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
                    graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
                    graphics.DrawImage(srcImage, new Rectangle(0, 0, newWidth, newHeight));
                    newImage.MakeTransparent();
                    newImage.Save(outputFile);
                }
            }
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.