远程桌面监控——位图压缩传输?

功能:一台计算机监控多台计算机桌面。

 

监控鼠标和键盘按键很容易,就是监控端发送自定义格式的消息告诉被监控端,被监控端响应调用Mouse_Move或Key_Press函数。

 

更重要的是:远程桌面图像。

 

过程分为:1.获取桌面图像; 2.(转换格式或压缩); 3.发送传输; 4.监控端接收; 5.(转换格式或解压缩); 6.显示。

 

获取桌面图片方法通用有:a.剪贴板直接拷贝屏幕(快速,但有时失效); b.Device Context设备描述表拷贝; c.DirectX(要求安装DX组件)。----->本人用方法b。

 

一张1024*768的24位真彩色图像bmp格式大小达2MB,而jpg格式200KB。图像数据很大,对计算机处理和网络传输很吃力,尤其是一台同时监控多台。一对以传输真彩色bmp位图,有1秒时延。

 

转换格式或压缩是最关键的地方。这里包括两步——选取适当的图像区域和采用适当的压缩或格式。

 

A. 选取适当的图像区域

准备只传输改变的部分图像。很多人提出“格”概念,即把屏幕分成m*n格,对比前后两帧图像是否改变,如果改变,就传输。可是,如果没有较好的方法,匹配各格图像是否改变要消耗很多时间。有CRC值比较、API函数MemCompare()内存比较和XOR计算。

CRC计算耗时,MemCompare耗内存,XOR比较理想,传输XOR改变的像素部分。

对区域的获取,有一个捷径跳过格比较——使用HOOK钩子,得到Windows系统的无效矩形,就是需要刷新的区域。

对图像大小的发送,有一个奇妙——监控端通常只是显示每一台受控端很小的图片,而不是整屏显示,所以可以先在受控端缩小图片再发送。

 

B. 对要发送的区域的图像,再压缩或者转换格式,使数据量更小

如果是转格式,推荐JPG,可以采用适当图像压缩算法压缩。

在监控端,解压或转换格式过程与这相对应。

 

 

如果每次传送整张图像,可以考虑用UDP,如果是传输改变的部分图像,推荐用TCP,因为图像像素丢失或错位,容易引起整体错乱,所以用TCP。

 

 

本人采用:1.在本地缩小图像在发送到监控端; 2.采取局部图像传输(传输区域获取暂定无效矩形); 3.采用图像压缩方法未定,还是怎么操作jpg图形也不太明白(bmp-jpg-stream-memfile)。

你可能感兴趣的:(程序与设计,GDI/GDI+)