摘要:隨著可視化技術在教學、商業(yè)、娛樂中的廣泛應用,市場對于大屏幕高清晰的需求日益增強,但是由于單個顯示屏幕的分辨率是有限的,而且隨著分辨率的提高,系統(tǒng)成本呈指數(shù)級上升。因此,通過整合多個顯示屏幕實現(xiàn)多投影顯示系統(tǒng)(即多屏幕繪制系統(tǒng))已成為構造低成本、高亮度、高分辨率顯示系統(tǒng)的最佳方案之一。多屏幕繪制系統(tǒng),由多臺投影儀通過疊合拼接而成的,能夠輸出高亮度、高分辨率圖像的大規(guī)模顯示設備。與單臺同樣性能的顯示設備相比,多屏幕繪制系統(tǒng)具有成本低和易擴展等優(yōu)勢。
關鍵詞:多屏幕;屏幕分割;圖形變換;GDI;BMP
中圖分類號:TG659 文獻標識碼:A 文章編號:1007-9599 (2012) 09-0000-02
隨著虛擬現(xiàn)實技術在商業(yè)、娛樂和科學計算可視化等領域中日益廣泛的應用和推廣,市場對投影和顯示系統(tǒng)的分辨率和亮度都提出了更高的要求。然而,單個顯示屏幕的分辨率是有限的,而且隨著分辨率的提高,系統(tǒng)成本呈指數(shù)級上升。因此,通過整合多個顯示屏幕實現(xiàn)多投影顯示系統(tǒng)(即多屏幕繪制系統(tǒng))已成為構造低成本、高亮度、高分辨率顯示系統(tǒng)的最佳方案之一。傳統(tǒng)的多投影顯示系統(tǒng)大多是通過將多個CRT或者LCD顯示屏進行硬件疊合來構建,難以實現(xiàn)無縫的拼接,而且不易維護和擴。
多屏幕繪制系統(tǒng)是通過網絡互連的多臺普通PC,連接多個擁有獨立投影設備屏幕組合成一個巨型屏幕,投影到非平面的異形幕(如環(huán)幕、球幕)上,并通過軟件的處理,將屏幕內容無縫地拼接在一起,并且實現(xiàn)整體畫面的實時同步播放。
一、開發(fā)工具及GDI
開發(fā)工具VC++是微軟公司開發(fā)的一個IDE(集成開發(fā)環(huán)境),VC++是Windows平臺上的C++編程環(huán)境,Windows下編程需要了解Windows的消息機制以及回調(callback)函數(shù)的原理;MFC是Win32API的包裝類,需要理解文檔視圖類的結構,窗口類的結構,消息流向等等;COM是代碼共享的二進制標準,需要掌握其基本原理等等。
圖形設備接口GDI 是Windows XP中的一個子系統(tǒng),它主要負責在顯示屏幕和打印設備輸出有關信息,它是一組通過C 類實現(xiàn)的應用程序編程接口。要實現(xiàn)屏幕抓圖,關鍵有兩點:一是獲取圖片所在窗口的窗口句柄,即在何處捕獲圖片;二是保存抓取的圖片。很顯然,實現(xiàn)第二點正是GDI+的強項。對于問題一,可以利用SetCapture () 函數(shù),它能夠追蹤鼠標指針的移動(包括在屏幕抓圖程序窗口之外的窗口)。在移動鼠標的過程中,它還可以根據(jù)鼠標的指針所在位置來判斷當前窗口的窗口句柄。我們還可以使用函數(shù)WindowFrom-Point (),這個函數(shù)能夠找出鼠標指針當前位置所對應的窗口句柄。使用過知名的抓圖軟件SnagIT的讀者都知道,在選擇抓圖窗口時,鼠標指針所在位置的窗口都會出現(xiàn)加粗的紅色邊框,以提醒目前所選擇的窗口,這個功能實現(xiàn)起來有些復雜。
二、BMP圖像文件
(一)BMP文件的讀寫
BMP文件分為4個組成部分,那么BMP文件的讀入也要按照4個組成部分依次進行處理,即先處理BITMAPFILEHEADER結構,然后是BITMAPINFOHEADER結構、顏色表,最后是位圖數(shù)據(jù)。
首先,有關BITMAPFILEHEADER、BITMAPINFOHEADER、RGBQUAD等結構的定義包含在頭文件“Windows.h”中,應把其包含進來。
其次,為了后面對圖像進行修改及存盤方便,我們定義了幾個全局變量,用來存放讀入圖像的位圖數(shù)據(jù)、寬、高、顏色表及每像素位數(shù)等信息。
(二)BMP圖像位圖數(shù)據(jù)的訪問
假設內存中位圖數(shù)據(jù)的指針為pBmpBuf,一行像素所占的字節(jié)數(shù)為lineByte(4的倍數(shù))那么,對于灰度圖像,第i行第j列的像素指針(所在的存儲空間位置)為pBmpBuf+i*lineByte+j,*(pBmpBuf+i*lineByte+j)是該像素的灰度值,如果想讓該像素變成指定顏色,只需要給*(pBmpBuf+i*lineByte+j)賦指定的值即可;對于彩色圖像,每像素占3個字節(jié),那么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文件結構去掉位圖文件頭結構后剩下的三部分,而這三部分結構包含了位圖顯示和處理所需要的所有信息。
三、圖像變換
(一)圖像的縮小、放大
本系統(tǒng)的圖像放大縮小做的比較簡單。先是調用MultiByteToWideChar函數(shù)轉換字符串然后判斷是用戶選擇縮小/放大,只需修改原圖的目標的寬度和高度。
(二)圖像的旋轉
當需要旋轉位圖時必須為DIB資源作拷貝(因為資源是只讀的),然后才能操作位圖數(shù)據(jù),當需要操作的是8位位圖(256色)時,可以逐行來處理位圖,每次拷貝一個字節(jié)。有幾個非常重要的技巧需要注意:
?DIB的每個掃描行都必須填補到32位的DWORD邊界。通過檢查信息頭中的元素 biWidth,來確定每行像素的總數(shù)是否是32的倍數(shù),如果不是,那么在計算資源位圖和目的位圖的字節(jié)偏移量時,需要考慮到填補的位數(shù)。當旋轉位圖90或270度時,位圖的高度成為寬度,反之亦然。盡管為位圖分配的內存不需要改變,但需要計算填補數(shù),以填補高度到DWORD邊界。填補高度是因為在新位圖中高度成為寬度,設備無關位圖存儲圖象從左到右,從下到上,因此存儲的位圖實際上是顯示的圖像的倒置,在編寫直接操作位圖的算法時便需要考慮到這一點。位圖數(shù)據(jù)順時針旋轉90實際上是位圖逆時針旋轉90,或者說位圖順時針旋轉270。
四、屏幕分割模塊的程序實現(xiàn)及結果
總體設計
本文研究的是如何讀取服務器屏幕分辨率然后根據(jù)所需分割子塊數(shù),按照子塊數(shù)目讀取相應的屏幕的像素坐標。對于當前已經分割后的圖像進行形變,即縮小、放大、旋轉后的圖像顯示在屏幕上。本文研究的系統(tǒng)分為兩個子塊:
1.局域網屏幕監(jiān)控:用來獲取服務器屏幕顯示的信息再發(fā)送到屏幕分割進行圖像處理。
2.屏幕分割顯示:接受到局域網屏幕監(jiān)控所發(fā)送的屏幕數(shù)據(jù)信息,然后對其進行圖像的分割,變形。
(一)局域網屏幕監(jiān)控
先是在服務器上啟動局域網屏幕監(jiān)控,來獲取當前服務器屏幕所顯示的內容。 VC中屏幕分分割的有很多種方法:1.用GID函數(shù)。2.用DIRECT方式。3.用windows media API 本文采用的是GID方法。具體的實現(xiàn)步驟為:
1.通過GetSystemMetrics獲取當前屏幕的分辨率。
2.通過GetDesktopWindow()函數(shù)得到桌面的窗口句柄
3.用GetDC()取得桌面窗口的DC
4.創(chuàng)建和屏幕DC兼容的位圖和DC(CreateCompatibleBitmap ()和CreateCompatibleDC()),并把這個位圖選進該DC(SelectObject())
(二)屏幕分割顯示
本系統(tǒng)屏幕分割顯示模塊主要實現(xiàn)功能如下:
1.實現(xiàn)2*2/2*3的屏幕切割。
2.顯示其中某一切割后的圖像。
3.根據(jù)所選中的圖片選擇圖像變換的方式(縮小、放大、旋轉度數(shù))。
五、總結
在教學、商業(yè)、娛樂可視化等領域中對于高分辨率,高清晰顯示的要求越來越高,而多屏幕繪制系統(tǒng)正好符合了市場需求。他可以彌補投影機等破播放設備硬件上的不足。達到了高清晰,低成本的目標。
本系統(tǒng)只是多屏幕繪制系統(tǒng)其中的一個模塊,其他模塊還包括時鐘同步,通訊兩個模塊。由于是單獨的一個子塊,他不能很好的體現(xiàn)出多屏幕繪制系統(tǒng)的整體運行功能。待3個模塊整合后,我相信多屏幕繪制系統(tǒng)將會是非常有市場價值的系統(tǒng)。
參考文獻:
[1]王修暉,華煒等.面向多投影顯示墻的畫面校正技術研究,軟件學報,2007,18(11)
[2]張志強.Windows 編程技術[M].北京:機械工業(yè)出版社
[3]宋坤,劉銳寧.Visal C++程序設計自學手冊,明日科技,2008,2
[4]侯俊杰.深入淺出MFC[M].北京:華中科技大學出版社,2001
[5]朱先忠.GDI+與GDI在屏幕抓圖中的應用,電腦編程技巧與維護,2008
[6]王社偉,朱如鵬,windows操作系統(tǒng)中的GDI坐標系統(tǒng),計算機與現(xiàn)代化,2003
[7]蔣春勇.Windows圖形編程中的坐標系與GDI映射方式,電腦知識與技術,2006
[作者簡介]
張成磊(1983-),男,江蘇泗陽人,柳州醫(yī)學高等??茖W校計算機初級講師,學士學位,研究方向:計算機教學