服务器上 GetThumbnailImage 中的 C# 内存不足异常
本文关键字:内存不足 异常 中的 GetThumbnailImage 服务器 | 更新日期: 2023-09-27 18:34:25
当用户向我们发送图像时,我正在运行以下代码以创建缩略图:
public int AddThumbnail(byte[] originalImage, File parentFile)
{
File tnFile = null;
try
{
System.Drawing.Image image;
using (System.IO.MemoryStream memoryStream = new System.IO.MemoryStream(originalImage))
{
image = System.Drawing.Image.FromStream(memoryStream);
}
Log.Write("Original image width of [" + image.Width.ToString() + "] and height of [" + image.Height.ToString() + "]");
//dimensions need to be changeable
double factor = (double)m_thumbnailWidth / (double)image.Width;
int thHeight = (int)(image.Height * factor);
byte[] tnData = null;
Log.Write("Thumbnail width of [" + m_thumbnailWidth.ToString() + "] and height of [" + thHeight + "]");
using (System.Drawing.Image thumbnail = image.GetThumbnailImage(m_thumbnailWidth, thHeight, () => false, IntPtr.Zero))
{
using (System.IO.MemoryStream tnStream = new System.IO.MemoryStream())
{
thumbnail.Save(tnStream, System.Drawing.Imaging.ImageFormat.Jpeg);
tnData = new byte[tnStream.Length];
tnStream.Position = 0;
tnStream.Read(tnData, 0, (int)tnStream.Length);
}
}
//there is other code here that is not relevant to the problem
}
catch (Exception ex)
{
Log.Error(ex);
}
return (tnFile == null ? -1 : tnFile.Id);
}
这在我的机器上工作正常,但是当我在测试服务器上运行它时,我总是在以下行出现内存不足异常: 使用 (System.Drawing.Image thumbnail = image。GetThumbnailImage(m_thumbnailWidth, thHeight, () => false, IntPtr.Zero))它不是在操作大图像:它试图将 480*640 的图像转换为 96*128 的缩略图。我不知道如何调查/解决此问题。有人有什么建议吗?它总是发生,即使在我重新启动 IIS 之后也是如此。我最初确实认为图像可能已损坏,但尺寸是正确的。谢谢。
ASP.Net 服务器中使用 GDI+ 操作时也遇到了类似的问题。你提到在服务器上运行的代码让我觉得,这可能是同样的问题。
请注意,服务器不支持在 System.Drawing
命名空间中使用类。致命的是,它可能会工作一段时间,然后突然(即使没有代码更改)发生错误。
我们不得不重写服务器代码的很大一部分。
请参阅评论:
注意事项
System.Drawing 命名空间中的类是 不支持在 Windows 或 ASP.NET 服务中使用。尝试 从这些应用程序类型之一中使用这些类可以 产生意外问题,例如服务性能下降 和运行时异常。有关受支持的替代方法,请参阅 Windows 成像组件。
源:http://msdn.microsoft.com/de-de/library/system.drawing(v=vs.110).aspx
@vcsjones为我指出正确的方向。而不是使用图像。获取缩略图我称之为:
public static Image ResizeImage(Image imgToResize, Size size)
{
return (Image)(new Bitmap(imgToResize, size));
}
麻烦的代码行现在是:
using(Image thumbnail = ResizeImage(image, new Size(m_thumbnailWidth, thHeight)))
我从调整图像大小 C# 中得到了这一行它现在可以工作了!