.net2.0与.NET4.0GDI+;区别?

.net2.0与.NET4.0GDI+;区别?,.net,graphics,gdi+,system.drawing,.net,Graphics,Gdi+,System.drawing,我有一个非常奇怪的问题,我有一个应用程序,它对图片进行了大量涉及GDI+的操作。例如裁剪、缩放等。我的应用程序在.NET2.0中运行良好,但在.NET4.0中,我从用户那里收到报告,它因gdi+“内存不足”错误而崩溃。现在我知道“内存不足”gdi+错误是很多错误的包罗万象,但是为什么它在.NET2.0中工作而在.NET4中不工作呢 具体地说,我有一个控件,它在每个层的顶部绘制“层”,以便创建合成位图。这个控件在.NET2.0中运行得很好,而在.NET4中则没有 当我从文件系统加载了一个1000万

我有一个非常奇怪的问题,我有一个应用程序,它对图片进行了大量涉及GDI+的操作。例如裁剪、缩放等。我的应用程序在.NET2.0中运行良好,但在.NET4.0中,我从用户那里收到报告,它因gdi+“内存不足”错误而崩溃。现在我知道“内存不足”gdi+错误是很多错误的包罗万象,但是为什么它在.NET2.0中工作而在.NET4中不工作呢

具体地说,我有一个控件,它在每个层的顶部绘制“层”,以便创建合成位图。这个控件在.NET2.0中运行得很好,而在.NET4中则没有

当我从文件系统加载了一个1000万像素的jpeg,并对图像进行缩放和变换时,就会发生这种情况

提供更多细节。g、 使用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>

其中,400%的scale 1s 4

System.Drawing.Graphics.drawinimage直接调用名为“GDIPDrawImageRectriti”的gdiplus函数。无论您使用什么.NET Framework,GDI+的版本都不多,其调用方式也是一样的。也许这篇文章可以帮助您:

如果系统是X86或X64,GDI+也可能不同。您要确保始终比较相同的内容。
也许您可以跟踪流程中加载的GDI+DLL,以帮助解决此问题。

我遇到了类似的问题。在我的情况下,问题是LOH碎片。也许这将有助于:


基本上,你知道内存是如何分配的。有时你会处理一些大数据集而侥幸逃脱,有时你的应用程序会失败。如果你的程序运行很长一段时间并处理大量数据,这个问题很可能会出现。你提到过1000万像素的图像-如果你对图像进行大量处理这样的文件很容易出现LOH问题。

欢迎使用SO=)只是为了确保……您将应用程序设置为target.net4,然后重新生成,然后出现了此问题?您是否有堆栈跟踪?以及
g.draw
方法到底是什么?是的,这是正确的。而且它似乎只发生在xp框中,即windows 7个框的工作方式很有魅力。0xa3目前我没有堆栈跟踪,但确切的g.draw调用如下:g.DrawImage(bmpBigPicture,新矩形(destBigX,destBigY,(int)(destbightscale),(int)(destbightscale)),0,0,bmpBigPicture.Width,bmpBigPicture.Height,GraphicsUnit.Pixel,imgAttribs);如果scale 1s 4 for 400%在日志记录上花费了一些时间,您确实需要获得更好的诊断。绘制这样缩放的图像不需要任何额外内存。感谢您的回答。这就是实际发生的情况。我不久前就发现了这一点,并且从未回圈将其标记为答案。对于延迟,我深表歉意。
g.DrawImage(
    bmpBigPicture,
    new Rectangle(
        destBigX,
        destBigY,
        (int)(destBigWidth*Scale),
        (int)(destBigHeight*Scale)),
    0,
    0,
    bmpBigPicture.Width,
    bmpBigPicture.Height,
    GraphicsUnit.Pixel,
    imgAttribs
);