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 图像大小调整质量的主要内容,如果未能解决你的问题,请参考以下文章