2011-11-28 105 views
3

當正從我的數據庫加載我的Web服務器上我的圖片,我看到以下錯誤:GDI +一般性錯誤

A generic error occurred in GDI+. at System.Drawing.Image.Save(Stream stream, ImageCodecInfo encoder, EncoderParameters encoderParams) at System.Drawing.Image.Save(Stream stream, ImageFormat format) at MyWeb.Helpers.ImageHandler.ProcessRequest(HttpContext context)

我所有的代碼正在嘗試做的是加載圖像

,任何人可以看看讓我知道我在做什麼錯了?

注 - 如果我在本地機器上測試它,但在將其部署到我的Web服務器時不起作用。

public void ProcessRequest(HttpContext context) 
{ 
    context.Response.Clear();   

    if (!String.IsNullOrEmpty(context.Request.QueryString["imageid"]))   
    { 
     int imageID = Convert.ToInt32(context.Request.QueryString["imageid"]); 
     int isThumbnail = Convert.ToInt32(context.Request.QueryString["thumbnail"]); 

     // Retrieve this image from the database 
     Image image = GetImage(imageID); 

     // Make it a thumbmail if requested 
     if (isThumbnail == 1) 
     { 
      Image.GetThumbnailImageAbort myCallback = new Image.GetThumbnailImageAbort(ThumbnailCallback); 
      image = image.GetThumbnailImage(200, 200, myCallback, IntPtr.Zero); 
     } 

     context.Response.ContentType = "image/png";    

     // Save the image to the OutputStream    
     image.Save(context.Response.OutputStream, ImageFormat.Png); 
    }   
    else   
    {    
     context.Response.ContentType = "text/html";    
     context.Response.Write("<p>Error: Image ID is not valid - image may have been deleted from the database.</p>");   
    } 
} 

錯誤發生就行了:

image.Save(context.Response.OutputStream, ImageFormat.Png);

UPDATE

我已經改變了我的代碼本,位問題仍然發生了:

var db = new MyWebEntities(); 

var screenshotData = (from screenshots in db.screenshots 
         where screenshots.id == imageID 
         select new ImageModel 
         { 
          ID = screenshots.id, 
          Language = screenshots.language, 
          ScreenshotByte = screenshots.screen_shot, 
          ProjectID = screenshots.projects_ID 
         }); 

foreach (ImageModel info in screenshotData) 
{ 
    using (MemoryStream ms = new MemoryStream(info.ScreenshotByte)) 
    { 
     Image image = Image.FromStream(ms); 

     // Make it a thumbmail if requested 
     if (isThumbnail == 1) 
     { 
       Image.GetThumbnailImageAbort myCallback = new Image.GetThumbnailImageAbort(ThumbnailCallback); 
       image = image.GetThumbnailImage(200, 200, myCallback, IntPtr.Zero); 
     } 

     context.Response.ContentType = "image/png"; 

     // Save the image to the OutputStream    
     image.Save(context.Response.OutputStream, ImageFormat.Png); 

    } } 

謝謝。

回答

2

也許出於同樣的原因,this guy有問題 - 因爲從Stream構建的圖像的一生中,該流不能被銷燬。

因此,如果GetImage函數從流中構造返回的圖像(例如MemoryStream),然後在返回圖像之前關閉流,則上述操作將失敗。我的猜測是,你GetImage看起來像這樣一點點:

Image GetImage(int id) 
{ 
    byte[] data = // Get data from database 
    using (MemoryStream stream = new MemoryStream(data)) 
    { 
     return Image.FromStream(data); 
    } 
} 

如果是這樣,則情況下嘗試有GetImage返回MemoryStream(或可能的字節數組)directrly,這樣你可以在你的ProcessRequest創建Image實例方法並僅在該圖像的處理完成時處理該流。

這是在the documentation中提到的,但它的一種小字體。

+0

嗨賈斯汀,我想我已經改變了我的代碼,以避免這種情況,但我仍然看到這個問題 - 你能看看我更新的問題嗎?另外,奇怪的是,這可以在我的開發盒上運行,但是當我將它部署到服務器時卻不行。 –

+0

@JimmyC不知道,圖像**很**大嗎? GDI +似乎強加了64K的高度限制。或者,您是否知道這是否僅適用於縮略圖?你也可以確定'ThumbnailCallback'沒有拋出異常嗎? – Justin

+0

圖像非常小。這發生在縮略圖和正常大小的圖像上。在我看來,像一個配置問題,由於它在我的本地機器上工作,但我不知道什麼類型的配置問題可能會導致此錯誤。 –

相關問題