2010-11-30 6 views
14

Ich habe ein wirklich seltsames Problem, wo ich eine Anwendung habe, die eine Menge von GDI + Manipulation von Bildern beteiligt. Wie das Zuschneiden von Zoom usw. Meine Anwendung funktioniert gut in .net 2.0, aber in .net 4.0 Ich bekomme Berichte von meinen Benutzern, dass es mit einem GDI + "nicht genügend Speicher" -Fehler stürzt. Jetzt weiß ich, dass der "out of memory" gdi + Fehler ein Haken für viele Fehler ist, aber warum würde es in .net 2.0 funktionieren und nicht auf .net 4..net2.0 vs .net 4.0 gdi + Unterschied?

Speziell ich habe eine Kontrolle, die "Schichten zeichnet "übereinander, um eine zusammengesetzte Bitmap zu erstellen. Dieses Steuerelement funktioniert gut in. NET 2.0 und nicht in. NET 4.

Es passiert, wenn ich eine 10 Megapixel JPEG aus dem Dateisystem geladen habe, und ich bin ein Zoom anwenden und auf das Bild zu transformieren.

um noch mehr Details zu geben. g.draw mit einer Matrixskala von 4 Bedeutung 400% größer mit jeder Drehung wird diese "out of memory error.

Es passiert nur auf XP-Boxen und nicht auf Windows 7 Boxen. Was könnte der Unterschied hier sein?

alle Abnehmer ...

hier ist das Ausmaß meiner Stack-Trace von der abgefangene Ausnahme protokolliert.

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

Vielen Dank für Ihre Zeit. sanft sein, wie dies hier meine erste Frage.

0xa3 Ich habe keinen Stack-Trace in dem Moment, aber der genaue g.draw Anruf unter:

g.DrawImage(
    bmpBigPicture, 
    new Rectangle(
     destBigX, 
     destBigY, 
     (int)(destBigWidth*Scale), 
     (int)(destBigHeight*Scale)), 
    0, 
    0, 
    bmpBigPicture.Width, 
    bmpBigPicture.Height, 
    GraphicsUnit.Pixel, 
    imgAttribs 
); 

wo Skala 1s 4 für 400%

+0

Willkommen bei SO =) Nur um sicher zu stellen ... Sie legen Ihre Anwendung auf Ziel ** .net4 ** und dann neu aufgebaut und dann tritt dieses Problem auf? – gideon

+0

Haben Sie zufällig eine Stapelverfolgung? Und was genau ist die "g.draw" -Methode? –

+0

Ja, das ist richtig. und es scheint nur auf den xp-kästen passieren, die windows 7 boxen funktionieren wie ein charm. –

Antwort

1

Ich konfrontiert ähnliche Probleme. In meinem Fall war das Problem die LOH-Fragmentierung. Vielleicht hilft das: Large Object Heap Fragmentation

Grundsätzlich wissen Sie neuere sicher, wie Speicher zugeordnet ist. Manchmal kommen Sie mit der Verarbeitung einiger großer Datenmengen durch, manchmal schlägt Ihre App fehl. Das Problem tritt häufiger auf, wenn das Programm über einen längeren Zeitraum ausgeführt wird und große Datenmengen verarbeitet werden. Sie haben ein Bild mit 10 Megapixeln erwähnt - wenn Sie mit solchen Dateien viel verarbeiten, ist es ziemlich einfach, das LOH-Problem zu lösen.

+0

Vielen Dank für diese Antwort. Dies ist, was tatsächlich geschah. Ich habe es vor einiger Zeit herausgefunden und bin nie zurückgegangen, um dies als Antwort zu bezeichnen. Die Verspätung tut mir leid. –

1

System.Drawing.Graphics.DrawImage eine direkt aufruft gdiplus-Funktion namens "GdipDrawImageRectRectI". Was auch immer .NET Framework Sie verwenden, es gibt nicht viele Versionen von GDI + und die Art, wie es heißt, ist das gleiche. Vielleicht kann dieser Beitrag helfen: Latest version of GDI+ and support information

GDI + kann auch anders sein, wenn das System X86 oder X64 ist. Sie möchten sicherstellen, dass Sie immer das Gleiche vergleichen. Vielleicht können Sie verfolgen, was GDI + DLL in Ihrem Prozess geladen ist, um dies zu beheben.