基于PC机的多屏幕绘制系统——屏幕分割模块

更新时间:2024-02-24 作者:用户投稿原创标记本站原创 点赞:27256 浏览:122206

摘 要 :随着可视化技术在教学、商业、娱乐中的广泛应用,市场对于大屏幕高清晰的需求日益增强,但是由于单个显示屏幕的分辨率是有限的,而且随着分辨率的提高,系统成本呈指数级上升.因此,通过整合多个显示屏幕实现多投影显示系统(即多屏幕绘制系统)已成为构造低成本、高亮度、高分辨率显示系统的最佳方案之一.多屏幕绘制系统,由多台投影仪通过叠合拼接而成的,能够输出高亮度、高分辨率图像的大规模显示设备.与单台同样性能的显示设备相比,多屏幕绘制系统具有成本低和易扩展等优势.


关 键 词 :多屏幕;屏幕分割;图形变换;GDI;BMP

中图分类号:TG659 文献标识码:A 文章编号:1007-9599 (2012) 09-0000-02

随着虚拟现实技术在商业、娱乐和科学计算可视化等领域中日益广泛的应用和推广,市场对投影和显示系统的分辨率和亮度都提出了更高的要求.然而,单个显示屏幕的分辨率是有限的,而且随着分辨率的提高,系统成本呈指数级上升.因此,通过整合多个显示屏幕实现多投影显示系统(即多屏幕绘制系统)已成为构造低成本、高亮度、高分辨率显示系统的最佳方案之一.传统的多投影显示系统大多是通过将多个CRT或者LCD显示屏进行硬件叠合来构建,难以实现无缝的拼接,而且不易维护和扩.

多屏幕绘制系统是通过网络互连的多台普通PC,连接多个拥有独立投影设备屏幕组合成一个巨型屏幕,投影到非平面的异形幕(如环幕、球幕)上,并通过软件的处理,将屏幕内容无缝地拼接在一起,并且实现整体画面的实时同步播放.

一、开发工具及GDI

开发工具VC++是微软公司开发的一个IDE(集成开发环境),VC++是Windows平台上的C++编程环境,Windows下编程需要了解Windows的消息机制以及回调(callback)函数的原理;MFC是Win32API的包装类,需要理解文档视图类的结构,窗口类的结构,消息流向等等;COM是代码共享的二进制标准,需要掌握其基本原理等等.

图形设备接口GDI 是Windows XP中的一个子系统,它主要负责在显示屏幕和打印设备输出有关信息,它是一组通过C 类实现的应用程序编程接口.要实现屏幕抓图,关键有两点:一是获取图片所在窗口的窗口句柄,即在何处捕获图片;二是保存抓取的图片.很显然,实现第二点正是GDI+的强项.对于问题一,可以利用SetCapture () 函数,它能够追踪鼠标指针的移动(包括在屏幕抓图程序窗口之外的窗口).在移动鼠标的过程中,它还可以根据鼠标的指针所在位置来判断当前窗口的窗口句柄.我们还可以使用函数WindowFrom-Point (),这个函数能够找出鼠标指针当前位置所对应的窗口句柄.使用过知名的抓图软件SnagIT的读者都知道,在选择抓图窗口时,鼠标指针所在位置的窗口都会出现加粗的红色边框,以提醒目前所选择的窗口,这个功能实现起来有些复杂.

二、BMP图像文件

(一)BMP文件的读写

BMP文件分为4个组成部分,那么BMP文件的读入也要按照4个组成部分依次进行处理,即先处理BITMAPFILEHEADER结构,然后是BITMAPINFOHEADER结构、颜色表,最后是位图数据.

首先,有关BITMAPFILEHEADER、BITMAPINFOHEADER、RGBQUAD等结构的定义包含在头文件“Windows.h”中,应把其包含进来.

其次,为了后面对图像进行修改及存盘方便,我们定义了几个全局变量,用来存放读入图像的位图数据、宽、高、颜色表及每像素位数等信息.

(二)BMP图像位图数据的访问

检测设内存中位图数据的指针为pBmpBuf,一行像素所占的字节数为lineByte(4的倍数)那么,对于灰度图像,第i行第j列的像素指针(所在的存储空间位置)为pBmpBuf+i*lineByte+j,*(pBmpBuf+i*lineByte+j)是该像素的灰度值,如果想让该像素变成指定颜色,只需要给*(pBmpBuf+i*lineByte+j)赋指定的值即可;对于彩像,每像素占3个字节,那么pBmpBuf+i*lineByte+j*3+0、pBmpBuf+i*lineByte+j*3+1、pBmpBuf+i*lineByte+j*3+2分别代表了第i行第j列像素B、G、R三个分量的指针,若想给该点指定一种颜色,则需要给三个分量分别赋值.

(三)设备无关位图(DIB)

我们介绍了BMP文件结构,实际上,BMP文件可以分为DIB格式和DDB格式.DDB格式(Device-Dependent Bitmanp)是与设备有关的BMP文件格式,用来存储与某个显示设备或打印设备内存兼容的不压缩图像,因其依赖于硬件设备,因此不常用.DIB格式(Device-Independent Bitmanp)是与设备无关的BMP文件格式,也就是我们前面介绍的BMP文件格式,它自带颜色信息,颜色表管理非常容易,具有很强的通用性.

调入内存中的DIB位图是脱离文件而存在的,其结构可以分为三部分,内存中的DIB实际上是BMP文件结构去掉位图文件头结构后剩下的三部分,而这三部分结构包含了位图显示和处理所需要的所有信息.

三、图像变换

(一)图像的缩小、放大

本系统的图像放大缩小做的比较简单.先是调用MultiByteToWideChar函数转换字符串然后判断是用户选择缩小/放大,只需修改原图的目标的宽度和高度.

(二)图像的旋转

当需要旋转位图时必须为DIB资源作拷贝(因为资源是只读的),然后才能操作位图数据,当需要操作的是8位位图(256色)时,可以逐行来处理位图,每次拷贝一个字节.有几个非常重要的技巧需要注意:

DIB的每个扫描行都必须填补到32位的DWORD边界.通过检查信息头中的元素 biWidth,来确定每行像素的总数是否是32的倍数,如果不是,那么在计算资源位图和目的位图的字节偏移量时,需要考虑到填补的位数.当旋转位图90或270度时,位图的高度成为宽度,反之亦然.尽管为位图分配的内存不需要改变,但需要计算填补数,以填补高度到DWORD边界.填补高度是因为在新位图中高度成为宽度,设备无关位图存储图象从左到右,从下到上,因此存储的位图实际上是显示的图像的倒置,在编写直接操作位图的算法时便需要考虑到这一点.位图数据顺时针旋转90实际上是位图逆时针旋转90,或者说位图顺时针旋转270.四、屏幕分割模块的程序实现及结果

总体设计

本文研究的是如何读取怎么写作器屏幕分辨率然后根据所需分割子块数,按照子块数目读取相应的屏幕的像素坐标.对于当前已经分割后的图像进行形变,即缩小、放大、旋转后的图像显示在屏幕上.本文研究的系统分为两个子块:

1.局域网屏幕监控:用来获取怎么写作器屏幕显示的信息再发送到屏幕分割进行图像处理.

2.屏幕分割显示:接受到局域网屏幕监控所发送的屏幕数据信息,然后对其进行图像的分割,变形.

(一)局域网屏幕监控

先是在怎么写作器上启动局域网屏幕监控,来获取当前怎么写作器屏幕所显示的内容. VC中屏幕分分割的有很多种方法:1.用GID函数.2.用DIRECT方式.3.用windows media API 本文采用的是GID方法.具体的实现步骤为:

1.通过GetSystemMetrics获取当前屏幕的分辨率.

2.通过GetDesktopWindow()函数得到桌面的窗口句柄

3.用GetDC()取得桌面窗口的DC

4.创建和屏幕DC兼容的位图和DC(CreateCompatibleBitmap ()和CreateCompatibleDC()),并把这个位图选进该DC(SelectObject())

(二)屏幕分割显示

本系统屏幕分割显示模块主要实现功能如下:

1.实现2*2/2*3的屏幕切割.

2.显示其中某一切割后的图像.

3.根据所选中的图片选择图像变换的方式(缩小、放大、旋转度数).

五、总结

在教学、商业、娱乐可视化等领域中对于高分辨率,高清晰显示的要求越来越高,而多屏幕绘制系统正好符合了市场需求.他可以弥补投影机等破播放设备硬件上的不足.达到了高清晰,低成本的目标.

本系统只是多屏幕绘制系统其中的一个模块,其他模块还包括时钟同步,通讯两个模块.由于是单独的一个子块,他不能很好的体现出多屏幕绘制系统的整体运行功能.待3个模块整合后,我相信多屏幕绘制系统将会是非常有市场价值的系统.