我在下面的示例代码中收到错误“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天时间来讨论这个
答案 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对象的生命周期。