我编写了一个 Web 服务来调整用户上传的图像的大小,并且从功能的角度来看一切正常,但每次使用它都会导致 CPU 使用率飙升。它在 Windows Server 2008 64 位上运行。我已尝试编译为 32 位和 64 位并获得大致相同的结果。
服务的核心是这个功能:
private Image CreateReducedImage(Image imgOrig, Size NewSize)
{
var newBM = new Bitmap(NewSize.Width, NewSize.Height);
using (var newGrapics = Graphics.FromImage(newBM))
{
newGrapics.CompositingQuality = CompositingQuality.HighSpeed;
newGrapics.SmoothingMode = SmoothingMode.HighSpeed;
newGrapics.InterpolationMode = InterpolationMode.HighQualityBicubic;
newGrapics.DrawImage(imgOrig, new Rectangle(0, 0, NewSize.Width, NewSize.Height));
}
return newBM;
}
我在该服务上放置了一个分析器,它似乎表明绝大多数时间都花在了 GDI+ 库本身上,而我的代码中并没有太多收获。
问题: 我在这里的代码中做了一些明显低效的事情吗?好像很符合我看到的例子。
使用 GDI+ 以外的库是否有好处?我看到的基准似乎表明 GDI+ 与其他库相比表现出色,但我没有找到足够的信心。
使用“不安全代码” block 是否有好处?
如果我没有包含足够的代码,请告诉我...我很乐意按照要求提供尽可能多的代码,但不想在帖子中令人讨厌。
最佳答案
图像处理通常是一项昂贵的操作。你必须记住,在你的应用程序开始任何类型的处理之前,32 位彩色图像在内存中扩展为 4 * 像素宽度 * 像素高度。尖峰绝对是意料之中的,尤其是在进行任何类型的像素处理时。
话虽这么说,但我认为您唯一能够加快进程或降低对处理器影响的地方就是尝试使用较低质量的插值模式。
关于c# - C# 和 .NET 3.5 中的图像大小调整效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1357257/