最近写了一个基于图象识别的监控软件。
先贴截图部分代码:
public Bitmap getPicture(Rectangle nrect)
{
IntPtr hscrdc = Win32API.GetWindowDC(WXConstants.HANDLE_MAIN_FORM_WINDOW);
DllOperationDelegations.RECT rect;
Win32API.GetWindowRect(WXConstants.HANDLE_MAIN_FORM_WINDOW, out rect);
IntPtr hbitmap = Win32API.CreateCompatibleBitmap(hscrdc, (int)(rect.Right + 10 - rect.Left), (int)(rect.Bottom + 10 - rect.Top));
IntPtr hmemdc = Win32API.CreateCompatibleDC(hscrdc);
Win32API.SelectObject(hmemdc, hbitmap);
Win32API.PrintWindow(WXConstants.HANDLE_MAIN_FORM_WINDOW, hmemdc, 0);
Bitmap bmp;
bmp = Bitmap.FromHbitmap(hbitmap);
Win32API.DeleteDC(hscrdc);
Win32API.DeleteDC(hmemdc);
Win32API.DeleteObject(hbitmap);
Bitmap b = new Bitmap(nrect.Width, nrect.Height, PixelFormat.Format32bppArgb);
Graphics g = Graphics.FromImage(b);
g.DrawImage(bmp, 0, 0, nrect, GraphicsUnit.Pixel);
g.Dispose();
return b;
}
技术很渣,也没测内存,结果在用户那边一跑,几十分钟就抛内存溢出,汗死
网上查了查,包括微软官网,都推荐用GDIDeleteObject()方法,不过释放与不释放,差别不是很明显,虽然性能提升50%。不过内存曲线还是快速攀升。
最后终于查到,截图之后,可以内存强制释放一次
GC.Collect();
内存溢出就解决了。CPU消耗也不是很高。
感觉这不是最好的方法,若有高人,请指点~~~~