2012-04-01 63 views
1

我在尝试调整图像大小并使用以下代码片段将其保存。它工作正常,但一些图像在调整大小后会失去质量。当我检查时,原始图像看起来很好,只有调整后的图像质量较差。我不知道如何在调整图像质量的同时改善图像质量。在C#中为asp.net调整图像大小时图像质量损失webform

System.Drawing.Image NewImage = FullsizeImage.GetThumbnailImage(NewWidth, MaxHeight, null, IntPtr.Zero); 
// Clear handle to original file so that we can overwrite it if necessary 
FullsizeImage.Dispose(); 
// Save resized picture 
//NewImage.Save(NewFile); 

if (fileExtension.ToLower() == ".jpg" || fileExtension.ToLower() == ".jpeg") 
{ 
     NewImage.Save(NewFile, System.Drawing.Imaging.ImageFormat.Jpeg); 
} 

请帮帮我。谢谢。

回答

2

你可以使用这个类:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Drawing; 
using System.Drawing.Drawing2D; 

/// <summary> 
/// Summary description for ResizeImage 
/// </summary> 
public class ResizeImage 
{ 
    public static Image Resize(Image imgToResize, int h, int w) 
    { 
     Size size = new Size(w, h); 

     int sourceWidth = imgToResize.Width; 
     int sourceHeight = imgToResize.Height; 

     float nPercent = 0; 
     float nPercentW = 0; 
     float nPercentH = 0; 

     nPercentW = ((float)size.Width/(float)sourceWidth); 
     nPercentH = ((float)size.Height/(float)sourceHeight); 

     if (nPercentH < nPercentW) 
      nPercent = nPercentH; 
     else 
      nPercent = nPercentW; 

     int destWidth = (int)(sourceWidth * nPercent); 
     int destHeight = (int)(sourceHeight * nPercent); 

     Bitmap b = new Bitmap(destWidth, destHeight); 
     Graphics g = Graphics.FromImage((Image)b); 

     g.InterpolationMode = InterpolationMode.HighQualityBicubic; 
     g.DrawImage(imgToResize, 0, 0, destWidth, destHeight); 
     g.Dispose(); 

     return (Image)b; 
    } 
} 

此外,您可以使用此代码来选择图像质量:

graphic.InterpolationMode = InterpolationMode.HighQualityBicubic; 
graphic.SmoothingMode = SmoothingMode.HighQuality; 
graphic.PixelOffsetMode = PixelOffsetMode.HighQuality; 
graphic.CompositingQuality = CompositingQuality.HighQuality; 

here

+2

您应该'Dispose'的'Bitmap'了。而不是明确地调用Dispose,'using'语句是处理的首选方式,因为它在出现'Exception'的情况下保证清理。 – spender 2012-04-01 11:45:39

+0

@aliriza:是否有可能使用.Save METHOD指定质量选项... – Learning 2012-04-01 11:49:49

+1

啊。也许放置位图并不是一个好主意,看起来就是返回的东西。这个方法的用户应该注意,返回的图像应该在完成时处理。 – spender 2012-04-01 11:55:19

0

随着调整图像大小,你也应该记住一些事情(经验法则,而不是一个福音,因为它取决于你在做什么等等。)...

  • 保持存储在Db的(或任何地方)最大的图像,你可以得到你的手(并提供您的Db /存储可以允许的)。即,您可以随时制作缩略图或缓存它们或其他东西,但最大的图像是“原始模型”,如果可能的话,缩小比例 - 不会放大,因为这绝不会是好,
  • 保持图像的“比例”,
  • 小心图像处理的,它必须做的权利,以避免增加噪声等
  • 你使用(用于保存或临时图像格式格式等)也是非常重要的,也可以毁掉你的图像,因为不同的格式有不同的算法,并且会牺牲图像的不同参数(不管是颜色还是细节等),
  • 尽可能少地使用'转换' - 所以保留原文,做简单的缩放比例 - 并尽可能保留在内存中。不保存/载入等

希望这有助于