前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >windows平台桌面截屏技术介绍

windows平台桌面截屏技术介绍

作者头像
lcyw
发布2022-06-10 19:34:46
1.7K0
发布2022-06-10 19:34:46
举报
文章被收录于专栏:machh的专栏

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才可以编译。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-11-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 音视频开发训练营 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一,GDI
  • 二,DirectX
  • 使用DDraw,D3d 均可实现桌面抓屏, 效率都不错, 前提是要安装directX 框架,支持XP及以上操作系统。
  • 缺点:也和GDI一样,如果启用了特效,速度也非常慢。
  • 三, DXGI
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档