我正在尝试使用C#中的Graphics and Images。我做了一个缩放功能。但在多次调用缩放函数后,我出现了OutOfMemory错误。每次调用Zoom功能时,我都会看到内存使用量增加。我不明白为什么会发生这种事。
Image Zoom(Image img, Point ZoomLvl)
{
Bitmap bmp = new Bitmap(img, (img.Width * ZoomLvl.X / 100), (img.Height * ZoomLvl.Y / 100));
Graphics g = Graphics.FromImage(bmp);
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
return bmp;
}
它被称为:
imgDisplayed = Zoom(imgOriginal, new Point(ZoomLevel, ZoomLevel));
picImage.Image = imgDisplayed;
imgOriginal是一个包含我的原始图像的Image对象。imgDisplayed也是缩放图像加载到的图像对象。这两个图像对象在我的类中都具有全局作用域。picImage是我表单上的一个图片框,显示缩放后的图像。
我目前正在处理8k图像,大约20-30次后就会出现内存不足的情况。它发生在缩放函数的第一行代码上,在该代码中创建了一个新的位图对象。到那时,内存使用率已达到4G。
我看不出我的内存使用量增长的原因。但确实如此。所以我不理解这里的一些东西。
创建新位图后,需要处理位图(在一段时间内(或传递给Zoom方法的原始图像。这些对象存储在进程内存中,在进程退出或调用Dispose之前永远不会释放。
此外,这个代码片段与使用的方式没有任何关系。
Graphics g = Graphics.FromImage(bmp);
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
如果要影响图像缩小操作的质量,请不要使用位图构造函数,而是使用Graphics对象中的DrawImage方法。
图形对象也应该被处理,例如通过在using语句中关闭它。