.net2.0 vs .net 4.0 gdi + разница?

У меня действительно странная проблема, когда у меня есть приложение, которое делает много задействованных изображений 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%

Ответ 1

Я столкнулся с подобными проблемами. В моем случае проблема заключалась в фрагментации LOH. Возможно, это поможет: Фрагментация кучи больших объектов

В основном вы знаете, как выделяется память. Иногда вам удастся обработать некоторый большой набор данных, иногда ваше приложение потерпит неудачу. Проблема, скорее всего, появится, если ваша программа работает в течение длительного периода времени и обрабатывает большой объем данных. Вы упомянули изображение 10 мегапикселей - если вы много обрабатываете с такими файлами, довольно легко попасть в проблему LOH.

Ответ 2

System.Drawing.Graphics.DrawImage напрямую вызывает функцию gdiplus с именем "GdipDrawImageRectRectI". Независимо от используемой .NET Framework, существует не так много версий GDI +, и способ, которым он называется, тот же. Может быть, этот пост может помочь: Последняя версия GDI + и информация о поддержке

GDI + может также отличаться, если система X86 или X64. Вы хотите, чтобы вы всегда сравнивали одно и то же. Возможно, вы можете отслеживать, что GDI + DLL загружается в ваш процесс, чтобы помочь разобраться в этом.