2010-09-28 67 views
0

我有一个调整图像大小的脚本,我没有写这个脚本,也不知道任何ASP.NET,但我已经被分配了修复它的问题!在ASP.NET中调整图像质量损失?

问题是,即使上传的文件已设置为正确的大小,调整大小后生成的图像的质量也会低于上传质量。

上传的图片 - http://climatechange.cbi.org.uk/uploaded/whatevhomep.jpg 调整后的图像 - http://climatechange.cbi.org.uk/ext_pages/resizeimage.aspx?img=/uploaded/whatevhomep.jpg&w=500

是做大小调整如下脚本,任何想法如何解决此问题?

using System; 
using System.Collections; 
using System.Configuration; 
using System.Data; 
using System.Drawing; 
using System.Drawing.Imaging; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.HtmlControls; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 

public partial class ext_pages_resizeImage : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     //Read in the image filename to create a thumbnail of 
     String imageUrl = ""; 

     try 
     { imageUrl = Request.QueryString["img"].ToString(); 
     }catch(Exception imgEx){} 

     //Read in the width and height 
     int thumbWidth = 0; 
     int imageOrigHeight = 0; 
     int imageOrigWidth = 0; 

     try 
     { 
      thumbWidth = Convert.ToInt32(Request.QueryString["w"].ToString()); 
     }catch(Exception imgHEx) 
     { 
      thumbWidth = Convert.ToInt32(Request.QueryString["amp;w"]); 
     } 


     if (!System.IO.File.Exists(Server.MapPath(imageUrl))) 
      Response.End(); 

     System.IO.FileInfo fileDetails = new System.IO.FileInfo(Server.MapPath(imageUrl)); 

     System.Drawing.Image fullSizeImg; 
     fullSizeImg = System.Drawing.Image.FromFile(Server.MapPath(imageUrl)); 

     imageOrigHeight = fullSizeImg.Height; 
     imageOrigWidth = fullSizeImg.Width; 

     Decimal sizeRatio = ((Decimal)imageOrigHeight/imageOrigWidth); 
     int thumbHeight = Decimal.ToInt32(sizeRatio * thumbWidth); 

     if (thumbHeight <= 0 || thumbWidth <= 0) 
     { 
      pageMisc oPageMisc = new pageMisc(); 

      oPageMisc.sendMail("[email protected]", "CBI CC Image Errors", "Width: " + thumbWidth.ToString() + ", Height: " + thumbHeight.ToString()); 
     } 

     Bitmap bmp = new Bitmap(thumbWidth, thumbHeight); 

     System.Drawing.Graphics gr = System.Drawing.Graphics.FromImage(bmp); 
     gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; 
     gr.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; 
     gr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High; 

     System.Drawing.Rectangle rectDestination = new System.Drawing.Rectangle(0, 0, thumbWidth, thumbHeight); 
     gr.DrawImage(fullSizeImg, rectDestination, 0, 0, imageOrigWidth, imageOrigHeight, GraphicsUnit.Pixel); 

     switch (fileDetails.Extension.ToUpper()) 
     { 
      case ".JPG": 
       Response.ContentType = "image/jpeg"; 
       break; 
      case ".GIF": 
       Response.ContentType = "image/gif"; 
       break; 
     } 

     //Do we need to create a thumbnail? 
     if (thumbHeight > 0 && thumbWidth > 0) 
     { 
      System.Drawing.Image.GetThumbnailImageAbort dummyCallBack; 
      dummyCallBack = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback); 

      System.Drawing.Image thumbNailImg; 
      thumbNailImg = fullSizeImg.GetThumbnailImage(thumbWidth, thumbHeight, dummyCallBack, IntPtr.Zero); 

      switch (fileDetails.Extension.ToUpper()) 
      { 
       case ".JPG": 
        bmp.Save(Response.OutputStream, ImageFormat.Jpeg); 
        break; 
       case ".GIF": 
        bmp.Save(Response.OutputStream, ImageFormat.Gif); 
        break; 
      } 

      //Clean up/Dispose... 
      thumbNailImg.Dispose(); 
     } 
     else 
     { 
      switch (fileDetails.Extension.ToUpper()) 
      { 
       case ".JPG": 
        fullSizeImg.Save(Response.OutputStream, ImageFormat.Jpeg); 
        break; 
       case ".GIF": 
        fullSizeImg.Save(Response.OutputStream, ImageFormat.Gif); 
        break; 
      } 
     } 

     //Clean up/Dispose... 
     fullSizeImg.Dispose(); 
     bmp.Dispose(); 
    } 

    public static bool ThumbnailCallback() 
    { 
     return false; 
    } 

} 

UPDATE出现错误消息

Compiler Error Message: CS0103: The name 'GetEncoder' does not exist in the current context 

Source Error: 


Line 109:     var codecParams = new EncoderParameters(1); 
Line 110:     codecParams.Param[0] = ratio; 
Line 111:     fullSizeImg.Save(Response.OutputStream, GetEncoder(ImageFormat.Jpeg), codecParams); 
Line 112:     break; 
Line 113:    case ".GIF": 

Line: 111 

回答

3

您需要为JPEG保存时指定一个更高的质量。用以下内容替换你JPEG情况:

case ".JPG": 
    Encoder quality = Encoder.Quality; 
    var ratio = new EncoderParameter(quality, 80L); 
    var codecParams = new EncoderParameters(1); 
    codecParams.Param[0] = ratio; 
    fullSizeImg.Save(Response.OutputStream, GetEncoder(ImageFormat.Jpeg), codecParams); 
    break; 

并添加此功能:大概需要GIF类似

private ImageCodecInfo GetEncoder(ImageFormat format) 
    { 
     ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders(); 
     foreach (ImageCodecInfo codec in codecs) 
      if (codec.FormatID == format.Guid) 
       return codec; 
     return null; 
    } 

东西。

+0

感谢您的答复。原谅我缺乏理解,但在代码中我会插入那个来获得完整质量的图像?谢谢! – Probocop 2010-09-28 14:03:11

+0

@probocop:看我的编辑 - 用我的JPG替换案例语句 – RedFilter 2010-09-28 14:08:49

+0

@RedFilter - 嗯我刚刚试过,它似乎是抛出一个错误,为什么会这样?我将案例替换为JPG,并将该文件备份到服务器。 – Probocop 2010-09-28 15:19:36

0

尝试使用GetThumbnailImage功能:

System.Drawing.Image.GetThumbnailImageAbort dummyCallBack 
     = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback); 
System.Drawing.Image thumbNailImg = fullSizeImg.GetThumbnailImage(
        nWidth, 
        nHeight, 
        dummyCallBack, 
        IntPtr.Zero); 

ThumnailCallback功能:

//this function is reqd for thumbnail creation 
    protected bool ThumbnailCallback() 
    { 
     return false; 
    } 
相关问题