2010-11-30 7 views
14

Tengo un problema realmente extraño donde tengo una aplicación que involucra mucha manipulación GDI + de imágenes. Como cortar zoom, etc. Mi aplicación funciona bien en .net 2.0, pero en .net 4.0 recibo informes de mis usuarios de que está fallando con un error gdi + "sin memoria". Ahora sé que el error "sin memoria" gdi + es una trampa para muchos errores, pero ¿por qué funcionaría en .net 2.0 y NO en .net 4..net2.0 vs .net 4.0 gdi + diferencia?

Específicamente tengo un control que dibuja "capas" "uno encima del otro para crear un mapa de bits compuesto. este control funcionó bien en .NET 2.0 y NO en .net 4.

Secically sucede cuando tengo un jpeg de 10 megapíxeles cargado desde el sistema de archivos y estoy aplicando un zoom y transfiero a la imagen.

para dar aún más detalles. g.draw con una escala de matriz de 4 que significa 400% más grande con cualquier rotación devolverá este "error de memoria

Sólo ocurre en cajas xp y NO en cajas de Windows 7. ¿Qué podría ser la diferencia aquí?

ningún arrendatario ...

aquí es la medida de mi seguimiento de la pila conectado desde la excepción capturada.

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

Gracias por su tiempo. ser suave ya que esta es mi primera pregunta aquí.

0xA3 no tengo ninguna traza de la pila en el momento, pero la llamada g.draw exacto es el siguiente:

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

donde la escala 1s 4 para 400%

+0

Bienvenido a SO =) Solo para asegurarse ... ¿Estableció su aplicación en el destino **. Net4 ** y luego la reconstruyó y luego se produjo este problema? – gideon

+0

¿Tiene un rastro de pila por casualidad? ¿Y cuál es el método 'g.draw' exactamente? –

+0

Sí, eso es correcto. y parece que solo ocurre en los cuadros xp, las cajas de Windows 7 funcionan como un amuleto. –

Respuesta

1

Me enfrenté a problemas similares. En mi caso, el problema era la fragmentación de LOH. Tal vez esto ayude: Large Object Heap Fragmentation

Básicamente, el más nuevo sabe con certeza cómo se asigna la memoria. Algunas veces se saldrá con la suya procesando un gran conjunto de datos, algunas veces su aplicación fallará. El problema es más probable que aparezca si su programa se ejecuta durante un período prolongado y procesa una gran cantidad de datos. Mencionaste una imagen de 10 megapíxeles. Si procesas mucho con esos archivos, es bastante fácil acceder al problema LOH.

+0

Gracias por esta respuesta. Esto es lo que realmente estaba sucediendo. Me di cuenta hace un tiempo y nunca volví en círculos para marcar esto como la respuesta. Perdón por el retraso. –

1

System.Drawing.Graphics.DrawImage llamadas directamente una función gdiplus llamada "GdipDrawImageRectRectI". Independientemente del Framework .NET que use, no hay muchas versiones de GDI + y la forma en que se llama es la misma. Tal vez esta publicación pueda ayudar: Latest version of GDI+ and support information

GDI + también puede ser diferente si el sistema es X86 o X64. Desea asegurarse de que siempre esté comparando lo mismo. Quizás pueda rastrear qué GDI + DLL está cargado en su proceso para ayudar a resolver esto.