保存缩略图,获取GDI +中发生的一般错误

时间:2011-02-05 17:40:28

标签: c# .net

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

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 +中发生一般错误。

任何想法?

2 个答案:

答案 0 :(得分:0)

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更方便。 Ditto WebClient.DownloadData用于内存中方法。

答案 1 :(得分:0)

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

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

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