2011-11-28 107 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

图像非常小。这发生在缩略图和正常大小的图像上。在我看来,像一个配置问题,由于它在我的本地机器上工作,但我不知道什么类型的配置问题可能会导致此错误。 –

相关问题