我在调整图像大小时遇到了很多内存不足的问题。起初我确信我只是在泄漏,所以我将我的自定义代码切换为基于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 中处理这种大小的图像将不胜感激。