.net 2.0 против .net 4.0 gdi + разница? - PullRequest
14 голосов
/ 01 декабря 2010

У меня действительно странная проблема, когда у меня есть приложение, которое использует GDI + для манипуляции изображениями.Например, масштабирование при кадрировании и т. Д. Мое приложение работает нормально в .net 2.0, но в .net 4.0 я получаю сообщения от моих пользователей о том, что оно выходит из строя с ошибкой gdi + «недостаточно памяти».Теперь я знаю, что ошибка «нехватка памяти» gdi + - это ловушка для многих ошибок, но почему она работает в .net 2.0, а НЕ в .net 4.

В частности, у меня есть элемент управления, который рисует«слои» друг на друге для создания составного растрового изображения.этот элемент управления работал отлично в .net 2.0, а НЕ в .net 4.

Это происходит, когда у меня загружен 10-мегапиксельный JPEG-файл из файловой системы, и я применяю масштабирование и преобразование изображения.

, чтобы дать еще больше деталей.g.draw с масштабом матрицы 4, означающим увеличение на 400% при любом повороте, вернет это «ошибка нехватки памяти».

Это происходит только на xp-блоках, а НЕ на windows 7-блоках. Какая здесь может быть разница?

Любые получатели ...

вот степень трассировки моего стека, записанная из пойманного исключения.

  <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
); 

, где масштаб 1с 4 для 400%

Ответы [ 2 ]

1 голос
/ 22 января 2013

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

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

1 голос
/ 02 декабря 2010

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

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

...