内存不足在点网中调整图像大小

时间:2015-06-10 09:50:50

标签: c# azure out-of-memory system.drawing imageprocessor

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

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

错误是"类型' System.OutOfMemoryException'发生在System.Drawing.dll中但未在用户代码"

中处理

基于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中无法处理此尺寸图像的原因将非常受欢迎。

0 个答案:

没有答案