帮忙分析一下,这个抓屏函数为什么会出现内存爆涨

book_jb9802 2014-08-12 09:36:18

public static Bitmap CaptureDesktop()
{
Bitmap image=null;
Rect rect = new Rect();
rect.Width = Screen.PrimaryScreen.Bounds.Width;
rect.Height = Screen.PrimaryScreen.Bounds.Height;

IntPtr dcTmp = CreateDC("DISPLAY", "DISPLAY", (IntPtr)null, (IntPtr)null);
Graphics gScreen = Graphics.FromHdc(dcTmp);
try
{
image = new Bitmap((int)(rect.Width), (int)(rect.Height), System.Drawing.Imaging.PixelFormat.Format24bppRgb);
Graphics gImage = Graphics.FromImage(image);
IntPtr dcImage = gImage.GetHdc();
IntPtr dcScreen = gScreen.GetHdc();
BitBlt(dcImage, 0, 0, (int)(rect.Width), (int)(rect.Height), dcScreen, (int)(rect.Left), (int)(rect.Top), TernaryRasterOperations.SRCCOPY);
gScreen.ReleaseHdc(dcScreen);
gImage.ReleaseHdc(dcImage);
}
catch
{ }
ReleaseDC(IntPtr.Zero, dcTmp);

return image;
}
...全文
143 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
於黾 2014-08-15
  • 打赏
  • 举报
回复
内存漏洞?是内存泄露吧...
xk280399649 2014-08-14
  • 打赏
  • 举报
回复
GC.Cellection() 回收资源
於黾 2014-08-14
  • 打赏
  • 举报
回复
Graphics gScreen Graphics gImage 这些东西,用完都要释放 返回的bmp对象,外面用完,也要释放 每执行一次方法,就创建3个图片对象,内存不暴涨才怪
xian_wwq 2014-08-14
  • 打赏
  • 举报
回复
非托管资源需要手动释放的
book_jb9802 2014-08-14
  • 打赏
  • 举报
回复
问题解决还真是 gScreen和 gImage没有释放,完整代码如下:

public static Bitmap CaptureDesktop()
        {

            Bitmap image=null;
            Rect rect = new Rect();
            rect.Width = Screen.PrimaryScreen.Bounds.Width;
            rect.Height = Screen.PrimaryScreen.Bounds.Height;

            IntPtr dcTmp = CreateDC("DISPLAY", "DISPLAY", (IntPtr)null, (IntPtr)null);
            Graphics gScreen = Graphics.FromHdc(dcTmp);
            try
            {
                image = new Bitmap((int)(rect.Width), (int)(rect.Height), System.Drawing.Imaging.PixelFormat.Format24bppRgb);
                Graphics gImage = Graphics.FromImage(image);
                IntPtr dcImage = gImage.GetHdc();
                IntPtr dcScreen = gScreen.GetHdc();
                BitBlt(dcImage, 0, 0, (int)(rect.Width), (int)(rect.Height), dcScreen, (int)(rect.Left), (int)(rect.Top), TernaryRasterOperations.SRCCOPY);
                gScreen.ReleaseHdc(dcScreen);
                gScreen.Dispose();   //缺少Dispose() 会有内存漏洞
                gImage.ReleaseHdc(dcImage);
                gImage.Dispose();    //缺少Dispose() 会有内存漏洞              
            }
            catch
            { }
            //ReleaseDC(IntPtr.Zero, dcTmp);
            DeleteDC(dcTmp);

            return image;  //外部使用后也要调用 Dispose();
        }
book_jb9802 2014-08-14
  • 打赏
  • 举报
回复
引用 5 楼 Z65443344 的回复:
Graphics gScreen Graphics gImage 这些东西,用完都要释放 返回的bmp对象,外面用完,也要释放 每执行一次方法,就创建3个图片对象,内存不暴涨才怪
gScreen和一gImage下面已经释放了,为什么还会长,这样释放哪里出了问题? gScreen.ReleaseHdc(dcScreen); gImage.ReleaseHdc(dcImage); 外面调用 dispose 问题还是一样
book_jb9802 2014-08-13
  • 打赏
  • 举报
回复
C#的对象也要手动释放内存吗?
devmiao 2014-08-12
  • 打赏
  • 举报
回复
image用完要dispose,在外面
book_jb9802 2014-08-12
  • 打赏
  • 举报
回复
这是Api的定义 [System.Runtime.InteropServices.DllImport("gdi32.dll")] public static extern IntPtr CreateDC(string driver, string device, IntPtr res1, IntPtr res2); [System.Runtime.InteropServices.DllImport("User32.dll")] static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC); public enum TernaryRasterOperations { SRCCOPY = 0x00CC0020, /* dest = source*/ SRCPAINT = 0x00EE0086, /* dest = source OR dest*/ SRCAND = 0x008800C6, /* dest = source AND dest*/ SRCINVERT = 0x00660046, /* dest = source XOR dest*/ SRCERASE = 0x00440328, /* dest = source AND (NOT dest )*/ NOTSRCCOPY = 0x00330008, /* dest = (NOT source)*/ NOTSRCERASE = 0x001100A6, /* dest = (NOT src) AND (NOT dest) */ MERGECOPY = 0x00C000CA, /* dest = (source AND pattern)*/ MERGEPAINT = 0x00BB0226, /* dest = (NOT source) OR dest*/ PATCOPY = 0x00F00021, /* dest = pattern*/ PATPAINT = 0x00FB0A09, /* dest = DPSnoo*/ PATINVERT = 0x005A0049, /* dest = pattern XOR dest*/ DSTINVERT = 0x00550009, /* dest = (NOT dest)*/ BLACKNESS = 0x00000042, /* dest = BLACK*/ WHITENESS = 0x00FF0062, /* dest = WHITE*/ }; [DllImport("gdi32.dll")] public static extern bool BitBlt(IntPtr hObject, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hObjSource, int nXSrc, int nYSrc, TernaryRasterOperations dwRop);

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧