OutOfMemoryException未处理

时间:2012-02-12 18:37:46

标签: c# bitmap out-of-memory system.drawing

我更改Automatic Image Stitching with Accord.NET应用程序以拼接多个文件 我在for loop代码上放了一个btnDoItAll,循环将取决于要拼接的图像数量。
我在循环结束时加入了一个裁剪代码。你可以看到here 出现了一个错误,在此部分中表示OutOfMemoryException was unhandled - Out of memory

croppedBitmap = croppedBitmap.Clone(new Rectangle(MinWidth, 0, (int)croppedBitmap.Width - MinWidth - MaxWidth, 1323), System.Drawing.Imaging.PixelFormat.DontCare);
希望你能再次帮助我。

The output from debug was these:  
Bitmap-width: 877
Bitmap-height: 1325
Width: -1
MinWidth: 877
A first chance exception of type 'System.OutOfMemoryException' occurred in System.Drawing.dll  

1 个答案:

答案 0 :(得分:1)

几小时前我遇到了类似的问题,检查克隆的界限。如果你移出你的位图,它将抛出这个异常。

所以请注意这种情况。

1: MinWidth + (int)croppedBitmap.Width - MinWidth - MaxWidth <= croppedBitmap.Width
2: 0 + 1323 <= croppedBitmap.Height

如果我的猜测是正确的1&amp; 2未实现

编辑: 在Clone前添加此内容并将结果发布到您的帖子中

Debug.WriteLine("Bitmap-width: "+croppedBitmap.Width);
Debug.WriteLine("Bitmap-height: "+croppedBitmap.Height);
Debug.WriteLine("Width: "+(croppedBitmap.Width - MinWidth - MaxWidth));
Debug.WriteLine("MinWidth: "+MinWidth);

EDIT2: 你的宽度是&lt; 0(在这种情况下为-1)不应该是这种情况 2.即使它是> 0会导致错误,因为877 + x是> 0 croppedBitmap.Width不允许

所以我从一开始就说的是你必须确保你的宽度和高度必须大于0并且你的矩形的宽度+ MinWidth和高度+ 0的总和不得超过边界你的形象。

现在你的矩形看起来像这样:

new Rectangle(877, 0, -1, 1323) // Rectangle(posx, posy, width, height)

所以你可以看到宽度是负的,这不是你想要的,它必须大于0.所以如果你现在就这样做:

new Rectangle(877, 0, 1, 1323)

因为你的矩形是从877到878(x坐标),所以仍然是错误的,因为你的图像只有877像素宽。这意味着MinWidth(int)croppedBitmap.Width - MinWidth - MaxWidth是错误的。你必须确保你的价值观不会引起这些问题。

复制方法不是问题,而是传递参数的问题。你必须在传递它们之前检查它们!