У меня действительно странная проблема, когда у меня есть приложение, которое делает много задействованных изображений GDI+. Такие, как масштабирование обрезки и т.д. Мое приложение отлично работает в .net 2.0, но в .net 4.0. Я получаю сообщения от своих пользователей о том, что он сбой с ошибкой gdi + "out of memory". Теперь я знаю, что ошибка "из памяти" gdi + - это уловка для многих ошибок, но зачем она работает в .net 2.0 и NOT на .net 4.
В частности, у меня есть элемент управления, который рисует "слои" друг над другом, чтобы создать скомпонованное растровое изображение. этот контроль работал отлично в .net 2.0 и NOT в .net 4.
Это происходит, когда у меня 10-мегапиксельный jpeg, загруженный из файловой системы, и я применяю масштабирование и преобразовываю изображение.
чтобы дать еще более подробную информацию. g.draw с матричной шкалой 4, что на 400% больше при любом повороте, вернет эту ошибку "из памяти".
Это происходит только в окнах xp и NOT на окнах 7. В чем тут разница?
любые участники...
вот масштаб моей трассировки стека, зарегистрированный из исключенного catch.
<Event>
<TimeStamp>11/30/10 11:02:43.706</TimeStamp>
<Source>APPro2</Source>
<EventType>Error</EventType>
<Message><![CDATA[##: OutOfMemoryException
Message:
Out of memory.
Stack Trace:
at System.Drawing.Graphics.CheckErrorStatus(Int32 status)
at System.Drawing.Graphics.DrawImage(Image image, Rectangle destRect, Int32 srcX, Int32 srcY, Int32 srcWidth, Int32 srcHeight, GraphicsUnit srcUnit, ImageAttributes imageAttrs, DrawImageAbort callback, IntPtr callbackData)
at System.Drawing.Graphics.DrawImage(Image image, Rectangle destRect, Int32 srcX, Int32 srcY, Int32 srcWidth, Int32 srcHeight, GraphicsUnit srcUnit, ImageAttributes imageAttr)
at Colorvision.Graphics.Layers.Picture.DrawBig(Graphics g) in D:\Colorvision_Workspaces\Colorvision\Graphics\Layers\Picture.cs:line 321
at Colorvision.Graphics.LayerCollection.DrawBig(Graphics e) in D:\Colorvision_Workspaces\Colorvision\Graphics\LayerCollection.cs:line 690]]></Message>
<EventID>0</EventID>
</Event>
Спасибо за ваше время. будьте осторожны, так как это мой первый вопрос здесь.
0xa3 На данный момент у меня нет трассировки стека, но точный вызов g.draw ниже:
g.DrawImage(
bmpBigPicture,
new Rectangle(
destBigX,
destBigY,
(int)(destBigWidth*Scale),
(int)(destBigHeight*Scale)),
0,
0,
bmpBigPicture.Width,
bmpBigPicture.Height,
GraphicsUnit.Pixel,
imgAttribs
);
где шкала 1s 4 для 400%