windows平台桌面截屏技术(GDI, DDRAW和DXGI三种抓屏方式)

windows平台桌面截屏技术(GDI, DDRAW和DXGI三种抓屏方式)
图片来源互联网,只做展示用

windows系统中,抓取屏幕有很多方法,比较常用的是GDI和mirror两种方式,除此以外,利用ddraw和DXGI(windows7以上系统支持)方式也可以抓取屏幕。由于mirror的方式涉及到驱动底层,并且也不是所有系统都支持,这里不做介绍,着重介绍GDI, DDRAW和DXGI这三种抓屏方式,

一 GDI 抓屏方式

所有的windows版本都通用的抓屏方式,这种抓屏方式相对比较慢,抓取一帧1080p的桌面需要5~8ms左右的时间。而且在vista以后的系统上,如果启用Aero特效的话,效率较低。

缺点:效率较差。

      HDC window_dc = ::GetDC(::GetDesktopWindow());

		winWidth_ = GetDeviceCaps(window_dc, HORZRES);

		winHeight_ = GetDeviceCaps(window_dc, VERTRES);

		hTemp_ = CreateCompatibleDC(window_dc);

		memBitmap_ = CreateCompatibleBitmap(window_dc, winWidth_, winHeight_);

		oldmemBitmap_ = (HBITMAP)SelectObject(hTemp_, memBitmap_);


		int rgbSize = 4 * winWidth_ * winHeight_;

		bih_.biBitCount = 32;

		bih_.biCompression = BI_RGB;

		bih_.biHeight = -winHeight_;

		bih_.biPlanes = 1;

		bih_.biSize = sizeof(BITMAPINFOHEADER);

		bih_.biSizeImage = rgbSize;

		bih_.biWidth = winWidth_;

		BitBlt(hTemp_, 0, 0, winWidth_, winHeight_, window_dc, 0, 0, SRCCOPY | CAPTUREBLT);

		GetDIBits(hTemp_, memBitmap_,

			0,

			winHeight_,

			rgbPtr_,

			(LPBITMAPINFO)&bih_,

			DIB_RGB_COLORS

		);

		DeleteDC(hTemp_);
		::ReleaseDC(::GetDesktopWindow(), window_dc);
		DeleteObject(memBitmap_);

二 DirectX 抓屏方式

使用DDraw,D3d 均可实现桌面抓屏, 效率都不错, 前提是要安装directX 框架,支持XP及以上操作系统。

缺点:也和GDI一样,如果启用了特效,速度也非常慢。

三 DXGI 抓屏方式

这种抓屏方式,速度非常快,而且即使启用了Aero特效,抓屏效率也一样。尤其在windows10以后的系统上,当桌面没有变化时,你是抓取不到任何图像的,只有在桌面有变化时,你才能抓取到图像。这会带来更高的抓屏效率和更少的系统开销。当然,它也不是完美的,它只能在vista以上的系统上才可以使用,老旧的xp是不支持这种新技术的。

缺点:但是只适用于win8及以后的操作系统,win7以前的系统无法使用此接口,不支持抓局部屏,只能是全屏。只能使用vs2012以上的IDE才可以编译。

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(3)

相关推荐

发表回复

登录后才能评论