Asp.net 图像大小调整质量

Posted

技术标签:

【中文标题】Asp.net 图像大小调整质量【英文标题】:Asp.net image resizing quality 【发布时间】:2014-02-17 11:22:24 【问题描述】:

我有这段代码,用于调整和保存用户发布的文件。 问题是,当我调整为 480px 宽度时,图像质量会下降很多,并且以 kb 为单位的大小仍然很大。

例如,当我使用诸如 Paint 之类的软件“手动”将同一图像的大小调整为 480 像素时,质量仍然与原始图像一样好(从我的眼睛可以看出),并且以 kb 为单位的大小要小得多而不是使用GetThumbNailImage 方法调整大小。

Mdn 说 “如果您从具有嵌入式缩略图的图像中请求较大的缩略图图像(例如,300 x 300),则缩略图图像的质量可能会明显下降。这可能会更好通过调用DrawImage 方法来缩放主图像(而不是缩放嵌入的缩略图)。”,但这似乎适用于 Windows 窗体,我需要一个网络应用程序。

那么我应该使用什么代码来执行此操作?

System.IO.Stream st = FileUploadPost.PostedFile.InputStream;

myImage = System.Drawing.Image.FromStream(st);
thumb = myImage.GetThumbnailImage(newWidth, newHeight, null, System.IntPtr.Zero);

thumb.Save(myPath);

【问题讨论】:

我写了这个函数来调整JPEG图像的大小,你可以在其中设置质量codingstill.com/2011/07/…。希望对你有帮助 感谢您的回复 codingstill 但似乎您的功能仅适用于 jpg 图像,我也使用其他格式。 【参考方案1】:

这是对我有用的代码。您可以设置新的位图分辨率:

using System.Drawing;

Bitmap img = (Bitmap)Bitmap.FromStream(FileUploadPost.PostedFile.InputStream);
Bitmap newImg = new Bitmap(maxWidth, maxHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
newImg.SetResolution(72, 72);
Graphics newGraphic = Graphics.FromImage(newImg);
newGraphic.Clear(Color.Transparent);
newGraphic.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
newGraphic.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
newGraphic.DrawImage(img, 0, 0, maxWidth, maxHeight);
System.Drawing.Imaging.ImageFormat format = default(System.Drawing.Imaging.ImageFormat);
string ext = Path.GetExtension(FileUploadPost.PostedFile.FileName);
switch (ext.ToLower())

    case ".gif":
        format = System.Drawing.Imaging.ImageFormat.Gif;
        break;
    case ".png":
        format = System.Drawing.Imaging.ImageFormat.Png;
        break;
    default:
        format = System.Drawing.Imaging.ImageFormat.Jpeg;
        break;

newImg.Save(myPath, format);

您可以将其包装在全局类的 void 函数中:

public static void UploadImage(HttpPostedFileBase file, int maxWidth, int maxHeight)

  //paste all the above code in here and replace FileUploadPost.PostedFile with file

然后你可以在你项目的任何地方调用它:

ClassName.UploadImage(FileUploadPost.PostedFile, 300, 300);

【讨论】:

也试过了,效果也很好。我的评论与回答 Ramzi 的评论相同。图像保持了很好的视觉质量,但以 kb 为单位的大小非常大。在绘画时,我可以将 2MB 文件减少到 89kb(当减少到 480px 时),这段代码减少到 394kb。【参考方案2】:

这个答案是否足够?

Resizing an image in asp.net without losing the image quality

这是一个经常出现的问题。

【讨论】:

【参考方案3】:

试试这个

using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;

public static System.Drawing.Image ResizeImage( System.Drawing.Image image, int percent ) 
  // percent is the actual integer percent of the original size

  System.Drawing.Bitmap imgThumb = new System.Drawing.Bitmap( image.Width * percent / 100, image.Height * percent / 100 );

  Rectangle sourceRect = new Rectangle( 0, 0, image.Width, image.Height );
  Rectangle destRect = new Rectangle( 0, 0, imgThumb.Width, imgThumb.Height );


  System.Drawing.Graphics g = System.Drawing.Graphics.FromImage( imgThumb );
  g.CompositingQuality = CompositingQuality.HighQuality;
  g.SmoothingMode = SmoothingMode.HighQuality;
  g.InterpolationMode = InterpolationMode.HighQualityBicubic;
  g.DrawImage( image, destRect, sourceRect, GraphicsUnit.Pixel );
  return ( imgThumb );

【讨论】:

好的,这很好用。视觉质量仍然非常好。尺寸问题仍然存在。原始上传文件为 2.518 kb。上传并使用此代码调整大小后,新大小变为 421kb。但是当我使用绘画手动完成时,我可以将 2.518kb 减少到 89kb 并保持视觉质量。有什么想法吗?

以上是关于Asp.net 图像大小调整质量的主要内容,如果未能解决你的问题,请参考以下文章

Asp.net 以 kb 为单位缩小图像大小

ASP.NET 图像上传与调整大小

调整图像大小以存储在数据库中 - ASP.NET

如何裁剪或调整图像大小以在 asp.net 中设置纵横比

在 Mono 上运行 ASP.NET 5 的 Ubuntu 上使用 MVC 6 调整图像大小

text 使用ImageSharp调整ASP.NET Core中的图像大小