保存位图会导致通用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

保存位图会导致通用GDI+错误

这通常是权限错误。

我发现如果我保存你的图像到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

每当我遇到这个问题时,我经常发现它归结为试图保存到无效或无法访问的路径。

在保存函数上设置一个断点,检查输出路径,然后尝试通过文件资源管理器访问相同的路径,这是一种验证没有拼写错误的快速方法。如果它存在,我将检查权限。

希望有帮助