使用编程语言进行截图的研究报告

        背景:

        在我的工作中,有一个工作是需要将指定的窗口进行截屏,然后传送截屏数据。可以理解为TeamViewer的工作,不过不同点在于我们要截图的区域就是我们自己的播放软件,播放的内容有视频文字等等,而且播放区域不一定是一个窗口,可能是多个Form的组合,于是我们为了截取这个复合窗口,我们一直在考虑的是使用截屏的方式,取得整屏图像,然后截取我们的复合窗口部分即可。

       比如我们的播放区域如下图:

       使用编程语言进行截图的研究报告_第1张图片

        目前遇到两个问题:

       1.使用的截屏方法不够高效,速度慢

       2.截屏会导致,我们窗口中可能播放的滚动的文字抖动,其本质在于我们的文字滚动原理是使用GDI每40ms绘制一次,这样才能让人眼感觉到连续的滚动(1000ms/24frame),这样对cpu的使用是很频繁的,而在截屏的那一刻势必牵扯到一次显卡数据拷贝的过程,这次拷贝比较大,于是我们文字的滚动收到影响,会顿一下。由于我们需要连续的截屏,然后将截屏数据传送出去在别的终端显示。于是文字就在不断地抖动了。。。


为了解决上述问题,才有了下面的完整报告:

第一阶段:

1.发现的问题:

目前使用的截图技术:采用Bitblt直接拷贝Display的数据,1)导致使用Direct3D进行走马灯绘制会抖动 2)效率不高

2.解决方向:    

寻找替代的截图方案,解决上述两个问题

3.研究过程:

1)使用Direct3D截图,核心代码:

     mv_pd3dDevice->GetFrontBufferData(0, mv_pSurface);

     未能解决问题:既影响播放也效率不高,截取桌面耗时50~60ms

   2)使用镜像驱动(Mirror Driver)截图,

      未能解决问题:影响走字

3)使用自制的显卡驱动获取显卡地址截图,

未能解决问题:效率不行,截取100行数据花费了80msCPU占用率80%,影响走字

第二阶段:

1.解决方向:

C++上入手寻找根据窗口DC截屏的方法 

2.研究过程

1)开始的研究

(1).发现使用Bitblt对单窗口进行位块拷贝,速度快不影响走字,

(2).播放软件主工程中,对所有所有播放的窗口截图,使用bitt或者transparentblt将所有拷贝的区域叠加在一起,组成最终截图

(3).使用共享内存,将截图实时存放进去,然后由服务循环取图并发送到接收卡显示

(4).通过上述步骤实现的播放抖动严重播放不稳定,接下来对将图像稳定的显示出来进行了研究


你可能感兴趣的:(截图Bitblt)