【问题标题】:saving thumbnail, getting A generic error occurred in GDI+保存缩略图,在 GDI+ 中出现一般错误
【发布时间】:2011-02-05 17:40:27
【问题描述】:

我正在使用以下方法为在线图像创建缩略图:

public static string SaveThumbnail(string imageUrl, int newWidth, int newHeight, string id)
{
    string uploadImagePath = "/UploadedImages/";
    Stream str = null;
    HttpWebRequest wReq = (HttpWebRequest)WebRequest.Create(imageUrl);
    HttpWebResponse wRes = (HttpWebResponse)(wReq).GetResponse();
    str = wRes.GetResponseStream();

    using (var image = Image.FromStream(str, false, true))
    {
        Image thumb = image.GetThumbnailImage(newWidth, newHeight, () => false, IntPtr.Zero);
        string pathAndName = Path.ChangeExtension(uploadImagePath + id, "thumb");
        thumb.Save(pathAndName);
        return pathAndName;
    }
}

但我得到了这个错误

说明:当前网页执行过程中出现未处理的异常
要求。请查看堆栈跟踪以获取有关错误及其位置的更多信息
起源于代码。

异常详情

System.Runtime.InteropServices.ExternalException:GDI+ 中发生一般错误。

有什么想法吗?

【问题讨论】:

  • 几天前我也遇到了这个错误。这是因为我用来保存图像的路径错误。仍然抛出 GDI+ 错误!

标签: c# .net


【解决方案1】:

Iirc 这是因为它喜欢流是可搜索的,而网络流不是。尝试先将流复制到 MemoryStream(如果很大,则复制到临时 FileStream),然后从那里开始工作(记住在读取之前将位置设置回 0)。

using(var ms = new MemoryStream()) {
    str.CopyTo(ms); // a 4.0 extension method
    ms.Position = 0;
    // TODO: read from ms etc
}

对于 FileStream,您可能会发现 WebClient.DownloadFile 更方便。内存方法同上 WebClient.DownloadData。

【讨论】:

    【解决方案2】:

    当 GDI 无法分配内存进行图像处理时,会发生 GDI+ 错误。当图像非常大并且 ASP.NET 工作进程限制了整个进程使用的内存时,就会发生这种情况。

    我们创建了一个自托管的 wcf 服务,它接受文件路径并返回调整大小的文件路径,该服务位于 windows 服务内部,它有自己的进程并且没有像 ASP.NET 那样的内存限制。在 ASP.NET 中,我们将文件存储在临时路径中,并以相同的路径调用 resizer 服务,然后我们可以访问我们调整大小的图像。

    基本上我们已经将调整大小的工作从 ASP.NET 应用转移到 windows 服务,ASP.NET 和 windows 服务之间的通信仅限于同一主机。

    【讨论】:

      猜你喜欢
      • 2010-12-19
      • 1970-01-01
      • 1970-01-01
      • 2019-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多