在位图上绘制时抛出OutOfMemory异常

时间:2018-02-07 19:14:48

标签: vb.net bitmap out-of-memory graphing

我已经开始使用图形软件几个月了,它已接近完成。唯一的问题是在绘制Bitmap时我一直得到的奇怪的OutOfMemory异常

首先,我声明一个全局位图变量(没有实例化),我将在其上绘制笛卡尔平面和图形。完成后,我会将其设置为表单上PictureBox的图像。

Private bmp As Bitmap 

一旦用户输入要绘制的函数,我调用一个过程,我首先在创建一个Graphics对象之前实例化Bitmap变量,我将用它来调用Draw过程:

bmp = New Bitmap(PictureBox1.Width, PictureBox1.Height)
Dim G As Graphics = Graphics.FromImage(bmp)

一旦完成,我调用一个循环结构,然后计算输入函数的点,将它们存储在我将在DrawCurve函数中使用的Point对象数组中。

Dim pts() As Point
.
.
<loop here>
.
.
G.DrawCurve(New Pen(...), pts)

如果它检测到渐近线,它会退出循环并继续绘制到目前为止已经计算过的图形部分,然后返回到循环的开始并在渐近线之后继续。我已经在几个具有多个渐近线(例如tan [x])的图上测试了这个并且它运行良好。但是,有一个我试图绘制的图表引发了异常。如果有帮助的话,那就是“sin(x ^ log(x))^ tan(x)”。该图本身有一些渐近线,在它绘制了大约3或4个段后,它在尝试执行DrawCurve过程时抛出了OutOfMemory异常

G.DrawCurve(New Pen(...), pts) 'OutOfMemory exception thrown

我已经检查过,应用程序使用的内存少于25 MB,大约10个左右的GDI对象,而不是很多句柄。我不明白OutOfMemory异常的来源。一切都井井有条,我应该指出更复杂的图形,甚至更多的渐近线都运行良好。我已经尝试了所有的东西,但每次都抛出相同的异常。如果计算机在重新启动时仍处于新鲜状态或已运行数小时,则无关紧要。如果我使用一些软件来释放RAM并不重要。事实上,它实际上说还有相当多的内存,但是当我尝试绘制位图时程序不断抛出OutOfMemory异常(到目前为止,我提到的一个图是这样做的,我还没有找到任何其他人)。我不知道会发生什么。任何人都有任何线索可能导致Bitmap上的DrawCurve函数抛出OutOfMemory异常?

1 个答案:

答案 0 :(得分:1)

结果显示OutOfMemory异常是用词不当,因为实际的罪魁祸首是传递给DrawCurve函数的无效参数。显然,一个只包含2个对象的Point数组无法处理,并且抛出了一个异常,令人困惑地称为&#34; OutOfMemory&#34;。

我还没有执行更多测试并尝试重新创建错误,但是现在,我只是插入了一个代码块,检查点数组中至少包含5个点,然后再传递它到DrawCurve函数。排除了混乱,图表出来顺利。

哦,顺便说一句,我在Visual Studio 2010上,所以这可能是一个很久以来的错误。无论如何,如果有人不断获得OutOfMemory异常而无法追溯到实际的资源过度消耗,那么很可能它是一个GDI对象,它遇到了一个例外情况,它可以&#39;认识并且只是脱口而出它的内存不足。检查你可能会传递的所有参数,你可能会很幸运