手记解决Graphics.DrawImage带ImageAttributes在XP报内存不足的问题

Posted ahdung

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手记解决Graphics.DrawImage带ImageAttributes在XP报内存不足的问题相关的知识,希望对你有一定的参考价值。

异常信息:

System.OutOfMemoryException: 内存不足。
   在 System.Drawing.Graphics.CheckErrorStatus(Int32 status)
   在 System.Drawing.Graphics.DrawImage(Image image, Rectangle destRect, Int32 srcX, Int32 srcY, Int32 srcWidth, Int32 srcHeight, GraphicsUnit srcUnit, ImageAttributes imageAttrs, DrawImageAbort callback, IntPtr callbackData)
   在 System.Drawing.Graphics.DrawImage(Image image, Rectangle destRect, Int32 srcX, Int32 srcY, Int32 srcWidth, Int32 srcHeight, GraphicsUnit srcUnit, ImageAttributes imageAttr, DrawImageAbort callback)
   在 System.Drawing.Graphics.DrawImage(Image image, Rectangle destRect, Int32 srcX, Int32 srcY, Int32 srcWidth, Int32 srcHeight, GraphicsUnit srcUnit, ImageAttributes imageAttr)
   ...

这个问题在外网也有一些讨论,我倾向的说法是,XP的GDI+组件存在问题,对于像素格式PixelFormat有点特别的图像,把它绘制到其它地方的时候处理不好ImageAttributes,于是引发异常。

解决思路,既然同时满足这两者会报错:

g.DrawImage(PixelFormat特别的Image, xxx, imageAttributes)

那么只要错开其一就行,比如这两种就不会报:

g.DrawImage(常规Image, xxx, imageAttributes); //方法一
g.DrawImage(PixelFormat特别的Image, xxx); //方法二,不使用imageAttributes

所以可以用方法二从原图得到一张像素格式正常的新图,然后用方法一把它画出去,就是弄个副本。

 

-END-

以上是关于手记解决Graphics.DrawImage带ImageAttributes在XP报内存不足的问题的主要内容,如果未能解决你的问题,请参考以下文章

我应该使用哪个 Gdiplus::Graphics::DrawImage 函数?

关于Jpanel中g.drawImage函数bug调试。。。

关于Jpanel中g.drawImage函数bug调试。。。

IM通讯协议专题学习:金蝶随手记团队的Protobuf应用实践(原理篇)

iOS 手记

Graphics.DrawString 以打印文档宽度为中心