我使用以下方法为在线图像创建缩略图:
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 +中发生一般错误。
任何想法?
答案 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)
我们创建了一个自托管的wcf服务,它接受文件路径并返回调整大小的文件路径,这个服务在windows服务中,它有自己的进程,没有像ASP.NET这样的内存限制。在ASP.NET内部,我们将文件存储在临时路径中,并使用相同的路径调用resizer服务,然后我们可以访问我们调整大小的图像。
基本上我们已将调整大小的工作量从ASP.NET应用程序转移到Windows服务,并且ASP.NET和Windows服务之间的通信仅限于同一主机。