OutOfMemoryException было необработанным - PullRequest
0 голосов
/ 12 февраля 2012

Я изменяю Автоматическое сшивание изображений с приложением Accord.NET для сшивания нескольких файлов.
Я вставил for loop в код btnDoItAll, цикл будет зависеть от того, сколько изображений было сшито.
Я присоединился к коду обрезки в конце цикла. Вы можете увидеть здесь .
Обнаружена ошибка, которая говорит 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 Ответ

1 голос
/ 12 февраля 2012

У меня только что была похожая проблема, несколько часов назад проверили ваши границы на клон. Если вы выйдете за пределы своего растрового изображения, оно выдаст это исключение.

Так что будьте осторожны, так оно и есть.

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

если мои предположения верны, 1 и 2 не выполнены

EDIT: Добавьте это перед 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: 1. Ваша ширина <0 (в данном случае -1), чего не должно быть 2. Даже если это будет> 0, это приведет к ошибке, так как 877 + x is> 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 неверны. Вы должны убедиться, что ваши значения не вызывают подобных проблем.

Это не проблема метода Copy, это скорее проблема переданных параметров. Вы должны проверить их, прежде чем передать их!

...