服务器上 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 之后也是如此。我最初确实认为图像可能已损坏,但尺寸是正确的。谢谢。

服务器上 GetThumbnailImage 中的 C# 内存不足异常

我们在

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# 中得到了这一行它现在可以工作了!