我正在用c ++ gdi gdi +编写程序。 在gdi +位图上绘制大图像很慢,使用gdi + api。 所以我使用以下方式绘制:
Bitmap img(xxx);
Graphics gr(&img);
HDC dc = gr.GetHDC();
::StretchDIBits(
dc,
rec.left, rec.top,
(rec.right - rec.left), (rec.bottom - rec.top),
m_recRegin.left , m_recRegin.top,
m_recRegin.right - m_recRegin.left, m_recRegin.bottom - m_recRegin.top,
XXX, XXX, DIB_RGB_COLORS, SRCCOPY);
gr.ReleaseHDC(dc);
这段代码运行得很好。 但是,当通过创建大量具有大尺寸CBitmap的compatibleDC时,系统范围的池已满。似乎无法在Bitmap上绘制任何东西。
发生什么事了?当这部分代码失败时,我仍然可以使用GDI + API绘制图形
GetLastError()返回8.
非常感谢!
答案 0 :(得分:1)
GetLastError()返回8
8是“没有足够的存储空间来处理此命令。”
因此,您的存储空间不足以供GDI用于执行::StretchDIBits
。
将来,您可以使用以下命令从命令行查找Windows错误:<{1}}。
答案 1 :(得分:0)
除了其他人所说的,Graphics对象实现了IDisposable。这意味着他们可能(并且实际上)持有有限的资源。确保您正在调用“gr.Dispose()”或将内容置于“使用”块中。如果不这样做,将由垃圾收集器决定何时完成对象以及释放其资源。对于资源密集型对象(例如Graphics。)来说,这是一种不好的做法。
根据大小,位图也可能是资源匮乏,因为它们可能占用大量RAM。如果您的代码示例中使用的位图从未在其后引用,也要确保它们被处理掉......