保存位图会导致通用GDI+错误
本文关键字:GDI+ 错误 位图 保存 | 更新日期: 2023-09-27 18:02:57
我一直在寻找解决方案,但还没有真正找到一个。这里是一些拼凑的代码,我一直在玩,试图让这个工作,但没有成功。
private Image GetAlbumArt(String url)
{
byte[] rBytes;
Image Testing;
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(url);
WebResponse myResponse = myRequest.GetResponse();
Stream rStream = myResponse.GetResponseStream();
using (BinaryReader br = new BinaryReader(rStream))
{
rBytes = br.ReadBytes(1000000);
br.Close();
}
myResponse.Close();
using (MemoryStream imageStream = new MemoryStream(rBytes, 0, rBytes.Length))
{
imageStream.Write(rBytes, 0, rBytes.Length);
Testing = Image.FromStream(imageStream, true);
Testing.Save("temp.jpg"); //Error here!
}
return Testing;
}
我实际上宁愿不保存位图,只是将位图返回给父函数,但这也不起作用。(如果您想使用位图,则无法关闭内存流)
真正奇怪的是,如果我给它一个不同的jpg url,这工作得很好。
不工作:http://2.images.napster.com/mp3s/2492/resources/207/116/files/207116316.jpg
工作:http://3.images.napster.com/mp3s/2256/resources/301/404/files/301404546.jpg
这通常是权限错误。
我发现如果我保存你的图像到bmp,它工作得很好。我也检查了你第一张图片的DPI比第二张要高很多。
好吧,这里是我写的一些代码片段来做同样的事情
WebClient webClient = new WebClient();
using (Stream stream = webClient.OpenRead(imgeUri))
{
using (Bitmap bitmap = new Bitmap(stream))
{
stream.Flush(); // not really necessary, but doesnt hurt
stream.Close();
try
{
// now, lets save to a memory stream and
// return the byte[]
MemoryStream ms = new MemoryStream();
// doesnt have to be a Png, could be whatever you want (jpb, bmp, etc.)
bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
return ms.GetBuffer()
}
catch (Exception err)
{
Console.WriteLine("{0}'t'tError: {1}", id, err.Message);
}
}
}
下面是关于这个错误的一个很好的讨论:http://weblogs.asp.net/anasghanem/archive/2009/02/28/solving-quot-a-generic-error-occurred-in-gdi-quot-exception.aspx
每当我遇到这个问题时,我经常发现它归结为试图保存到无效或无法访问的路径。
在保存函数上设置一个断点,检查输出路径,然后尝试通过文件资源管理器访问相同的路径,这是一种验证没有拼写错误的快速方法。如果它存在,我将检查权限。
希望有帮助