3

我在调整图像大小时遇到​​了很多内存不足的问题。起初我确信我只是在泄漏,所以我将我的自定义代码切换为基于https://github.com/JimBobSquarePants/ImageProcessor的东西,并且发生了同样的问题。

所以导致问题的源图像可能是 7137x10096 未压缩,应该是 7137x10096x4 = 288220608 字节或 274Mb。好吧,那是“大”,但为什么它大得令人不安?运行 IISExpress(32 位)会导致内存不足。在 Azure 上运行 3.5GB 的 64 位服务器,它根本不可靠。

错误是“System.Drawing.dll 中出现‘System.OutOfMemoryException’类型的异常,但未在用户代码中处理”

基于 ImageProcessor 的代码在 imageFactory.Load 语句上抛出

   public bool ProcessStream(Size size, Func<MemoryStream, bool> resultCallback, string gravity, Stream inStream, int quality=80)
    {
        inStream.Position = 0;
        bool res = false;
        using (var outStream = new MemoryStream())
        {
            using (var imageFactory = new ImageFactory())
            {
                var anchor = AnchorPosition.Center;
                if (gravity == "top") anchor = AnchorPosition.Top;
                if (gravity == "bottom") anchor = AnchorPosition.Bottom;
                var layer = new ResizeLayer(size, ResizeMode.Pad, anchor);

                imageFactory.Load(inStream)
                    .Resize(layer)
                    .BackgroundColor(System.Drawing.ColorTranslator.FromHtml("#FFFFFF"))
                    .Quality(quality)
                    .Save(outStream);
                res = resultCallback(outStream);
            }
        }
        return res;
    }

在最简单的测试用例中,我用

     public bool nop(MemoryStream s)
     {
         return true;
     }

     public string TestResize()
     {
         var resizer = new ResizeImage();
         var size = new System.Drawing.Size(300, 400);
         using (
             var filestream =
                 new FileStream(
                     @"C:\Users\Andrew\problem issues\NastyLargeImageThatBreaksThings.jpg",
                     FileMode.Open, FileAccess.Read))
         {
             var res = resizer.ProcessStream(size, nop, "top", filestream, 75);
             return res.ToString();
         }
     }

我可以:

1)尝试不同的技术

2) 升级我的 Azure 服务器以获得更多内存(不确定是否有帮助)

3) 尝试通过第三方服务调整大小,例如http://www.blitline.com/,它具有一些 Azure 特定的集成。

任何理解为什么无法在 Systen.Drawing 中处理这种大小的图像将不胜感激。

4

0 回答 0