2015-11-02 67 views
-1

例外我想保存我調整大小的圖像,但我得到一個GDI +錯誤。代碼:GDI + Bitmap.Save

 System.Drawing.Image image = System.Drawing.Image.FromFile(Server.MapPath(path)); 
     float aspectRatio = (float)image.Size.Width/(float)image.Size.Height; 
     int newHeight = 200; 
     int newWidth = Convert.ToInt32(aspectRatio * newHeight); 
     System.Drawing.Bitmap thumbBitmap = new System.Drawing.Bitmap(newWidth, newHeight); 
     System.Drawing.Graphics thumbGraph = System.Drawing.Graphics.FromImage(thumbBitmap); 
     thumbGraph.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; 
     thumbGraph.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; 
     thumbGraph.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
     var imageRectangle = new Rectangle(0, 0, newWidth, newHeight); 
     thumbGraph.DrawImage(image, imageRectangle); 
     thumbBitmap.Save("~/images/galeria/thumb/" + FileUpload1.FileName); 
     thumbGraph.Dispose(); 
     thumbBitmap.Dispose(); 
     image.Dispose(); 

錯誤是由這一行造成的:

thumbBitmap.Save("~/images/galeria/thumb/" + FileUpload1.FileName); 

任何想法如何解決這個問題?

EDIT1:

類型「System.Runtime.InteropServices.ExternalException」的一個例外發生在System.Drawing.dll程序但在用戶代碼

附加信息沒有處理:在GDI發生一般性錯誤+ 。

+0

請給我們完整的錯誤描述。 –

+0

調試器。斷點。使用它們,也許,你能給我們完整的錯誤? – 2015-11-02 19:37:19

+0

確定它是一個有效的路徑?有寫權限? – TaW

回答

2

你有幾件事情你的代碼錯誤:

thumbBitmap.Save("~/images/galeria/thumb/" + FileUpload1.FileName); 
  1. 只能在通過HttpServerUtility.MapPath(即this.Server.MapPath)走的路徑使用~字符。 GDI需要一個有效的Win32文件名。您需要首先翻譯文件名。
  2. 您不能信任上傳文件的FileName屬性:某些版本的Internet Explorer提供完整的本地文件名,這意味着您的路徑將爲.../galeria/thumb/D:\Me\myfile.jpg,這是無效的。其他網頁瀏覽器通常會提供一個虛假的名稱,並且只保留文件擴展名。您也不能相信用戶提供正確的擴展名。如果用戶上傳可解釋爲有效位圖的惡意文件,但是也是擦除服務器硬盤的有效PHP腳本,會發生什麼情況?
  3. 對於明確調用Dispose方法,您應該始終偏好using塊。
  4. 導入System.Drawing名稱空間,以便您不在代碼中指定完整類型名稱。
  5. 您正在將縮略圖保存爲位圖,這些都是大型未壓縮文件。您應該將它們壓縮爲JPEG或PNG圖像。您還在使用原始圖像的文件擴展名保存圖像(您不能相信)。

這是我會怎麼改進:

using(Image image = Image.FromFile(Server.MapPath(path))) { 

    float aspectRatio = (float)image.Size.Width/(float)image.Size.Height; 
    int newHeight = 200; 
    int newWidth = (ToInt32)(aspectRatio * newHeight); 

    using(Bitmap thumbBitmap = new System.Drawing.Bitmap(newWidth, newHeight)) 
    using(Graphics thumbGraph = Graphics.FromImage(thumbBitmap)) { 

     thumbGraph.CompositingQuality = CompositingQuality.HighQuality; 
     thumbGraph.SmoothingMode = SmoothingMode.HighQuality; 
     thumbGraph.InterpolationMode = InterpolationMode.HighQualityBicubic; 

     Rectangle imageRectangle = new Rectangle(0, 0, newWidth, newHeight); 
     thumbGraph.DrawImage(image, imageRectangle); 

     String outputFileName = this.Server.MapPath("~/images/galeria/thumb"); 
     outputFileName = Path.Combine(outputFileName, Path.GetFileNameWithoutExtension(path)) + ".jpg"; 

     // Use code from here to save as a JPEG: https://msdn.microsoft.com/en-us/library/bb882583(v=vs.110).aspx 
     thumbBitmap.Save(outputFileName, jpegEncoder, jpegEncoderParameters); 
    } 
} 
+0

它給了我InterpolationMode上的GDI +錯誤,但是如果我對它進行評論,那麼它會給出Rectangle上的GDI +錯誤。 – Ashiv3r