GDI +中发生了一般错误

时间:2011-12-19 06:17:20

标签: c# .net winforms gdi+

我在下面的示例代码中收到错误“GDI +中发生了一般错误”。我所做的是我发出请求以获取现场网站上许多jpeg文件的响应。 当我得到响应时,我将文件保存到我的应用程序的本地文件夹 并将这些图像转换为二进制(数组的字节),以便我可以将其保存到数据库中。

private byte[] GetBinaryImageData(string imgURL)
{
    HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(imgURL);
    WebResponse response = Request.GetResponse();
    Stream str = response.GetResponseStream();
    System.Drawing.Image objTempImg = System.Drawing.Image.FromStream(str);
    objTempImg.Save(FileName, ImageFormat.Jpeg);

    FileStream fileStream = new FileStream(FileName, FileMode.Open, FileAccess.Read);
    byte[] buffer = new byte[fileStream.Length];
    fileStream.Read(buffer, 0, (int)fileStream.Length);
    fileStream.Close();
    return buffer;
}

我没有为所有图像收到此错误,但是对于某些图像会出现此错误。有人知道解决方案吗?我已经花了2天时间来讨论这个

2 个答案:

答案 0 :(得分:2)

如果我不得不猜;由于你没有正确处理事情,它偶尔会出现问题。对于像GDI +这样的事情,这尤其非常重要。在代码中引入一些using语句,因为这些对象中的所有都是IDisposable

HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(imgURL);
using(WebResponse response = Request.GetResponse())
using(Stream str = response.GetResponseStream())
using(System.Drawing.Image objTempImg = System.Drawing.Image.FromStream(str))
{
    objTempImg.Save(FileName, ImageFormat.Jpeg);
}
return File.ReadAllBytes(FileName);

(注意我也改变了你的文件阅读代码,因为它非常不可靠; 不正确假设Stream.Read实际上读取了所有数据;你应该检查返回值和循环;但由于你想要它,File.ReadAllBytes更容易)。

答案 1 :(得分:2)

根据this article来判断,图像加载的流必须在图像的生命周期内存在,否则可能会发生不良事件。

我不时遇到这种情况,发现最简单的方法是将图像数据复制到内存流或文件中,我的进程控制并从中构建图像。

来自链接文章:

  

GDI +,因此System.Drawing命名空间可能会推迟   解码原始图像比特直到图像需要比特。   另外,即使在图像被解码之后,GDI +也可以   确定丢弃大内存的效率更高   位图并稍后重新解码。因此,GDI +必须能够访问   位图或图像生命周期中图像的源位   宾语。

     

为了保持对源位的访问,GDI +锁定任何源文件,和   强制应用程序维护任何源流的生命周期   Bitmap或Image对象的生命周期。