我在内存大小调整图像时出现了很多问题。我起初确信我只是在泄漏,所以我将自定义代码切换为基于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中无法处理此尺寸图像的原因将非常受欢迎。