2016-11-17 67 views
2

此函數返回調整大小和居中的圖像,並執行調用url thumb.aspx?image=test.jpg&width=100&height=50問題在於執行後,我無法重命名或刪除原始文件文件從服務器。調整大小後無法刪除或重命名原始文件

<%@ Import Namespace="System.Drawing" %> 
    <script language="C#" runat="server"> 
    void Page_Load(Object sender, EventArgs e) { 
     try { 
     Response.Cache.VaryByParams["Image;Width;Height;needToFill"] = true; 
     Response.ContentType = "image/jpeg"; 
     System.Collections.Hashtable imageOutputFormatsTable = new System.Collections.Hashtable(); 
     imageOutputFormatsTable.Add(System.Drawing.Imaging.ImageFormat.Gif.Guid, System.Drawing.Imaging.ImageFormat.Gif); 
     imageOutputFormatsTable.Add(System.Drawing.Imaging.ImageFormat.Jpeg.Guid, System.Drawing.Imaging.ImageFormat.Jpeg); 
     imageOutputFormatsTable.Add(System.Drawing.Imaging.ImageFormat.Bmp.Guid, System.Drawing.Imaging.ImageFormat.Gif); 
     imageOutputFormatsTable.Add(System.Drawing.Imaging.ImageFormat.Tiff.Guid, System.Drawing.Imaging.ImageFormat.Jpeg); 
     imageOutputFormatsTable.Add(System.Drawing.Imaging.ImageFormat.Png.Guid, System.Drawing.Imaging.ImageFormat.Jpeg); 
     string imageLocation = Server.MapPath(Request.QueryString["Image"]); 
     int Width = Convert.ToInt32(Request.QueryString["Width"]); 
     int Height = Convert.ToInt32(Request.QueryString["Height"]); 
     System.Drawing.Bitmap image = new System.Drawing.Bitmap(imageLocation); 
     int sourceWidth = image.Width; 
     int sourceHeight = image.Height; 
     int sourceX = 0; 
     int sourceY = 0; 
     double destX = 0; 
     double destY = 0; 
     double nScale = 0; 
     double nScaleW = 0; 
     double nScaleH = 0; 
     bool needToFill=true; 
     nScaleW = ((double)Width/(double)sourceWidth); 
     nScaleH = ((double)Height/(double)sourceHeight); 

     if (Request.QueryString["needToFill"] != null) { 
      needToFill = Convert.ToBoolean(Request.QueryString["needToFill"]); 
     } 

     if (!needToFill) { 
      nScale = Math.Min(nScaleH, nScaleW); 
     } else { 
      nScale = Math.Max(nScaleH, nScaleW); 
      destY = (Height - sourceHeight * nScale)/2; 
      destX = (Width - sourceWidth * nScale)/2; 
     } 

     if (nScale > 1) nScale = 1; 

     int destWidth = (int)Math.Round(sourceWidth * nScale); 
     int destHeight = (int)Math.Round(sourceHeight * nScale); 

     System.Drawing.Bitmap bmPhoto = new System.Drawing.Bitmap(destWidth + (int)Math.Round(2 * destX), destHeight + (int)Math.Round(2 * destY)); 
     bmPhoto.SetResolution(72, 72); 
     System.Drawing.Imaging.ImageFormat outputFormat = (System.Drawing.Imaging.ImageFormat)imageOutputFormatsTable[image.RawFormat.Guid]; 
     ApplicationException ex= new ApplicationException(string.Format("destWidth:{0}, destX:{1}, destHeight:{2}, desxtY:{3}, Width:{4}, Height:{5}", destWidth, destX, destHeight, destY, Width, Height)); 
     System.Drawing.Graphics grPhoto = System.Drawing.Graphics.FromImage(bmPhoto); 
     Rectangle to = new System.Drawing.Rectangle((int)Math.Round(destX), (int)Math.Round(destY), destWidth, destHeight); 
     Rectangle from = new System.Drawing.Rectangle(sourceX, sourceY, sourceWidth, sourceHeight); 
     grPhoto.DrawImage(image, to, from, System.Drawing.GraphicsUnit.Pixel); 

     bmPhoto.Save(Response.OutputStream, outputFormat); 
     bmPhoto.Dispose(); 
     grPhoto.Dispose(); 
     } 
     catch (Exception ex){ 
     System.IO.StreamWriter sw=null; 
     try{ 
      sw=new System.IO.StreamWriter(Server.MapPath("error.txt"),true); 
      sw.WriteLine("Error : " + ex.Message + " processing " + Request.QueryString["Image"]); 
     }  
     catch{}  
     finally{sw.Close();} 
     Response.Redirect("thumberror.gif"); 
     } 
    } 
    </script> 
+1

'image'看起來並不像它正在處理中。我建議使用'using'語句來使資源管理更加清晰。 – vcsjones

+0

將所有內容都移出該控件,而不需要閱讀請求並返回響應。將圖像大小調整邏輯移動到它自己的類中。然後,您可以在不啓動Web服務器的情況下測試該課程。 – axlj

+0

@vcsjones您的評論是答案;) – Vixed

回答

3

image看起來並不像它的佈置。我建議使用using語句來使資源管理更加清晰。

A using statement允許在範圍內放置東西,當範圍被留下時,它會調用Dispose。例如:

using(var image = new Bitmap(imageLocation)) 
{ 
    //Use image here 
} //image will be disposed here 
+1

你是什麼意思,說「使用聲明」? – Vixed

+0

@Vixed請參閱編輯。 – vcsjones

+0

試過了,但無法理解:) – Vixed

相關問題