馮偉桓,王茂芝,曾穎超
(成都理工大學數學地質四川省重點實驗室,四川 成都 610059)
為解決Windows桌面系統圖片操作時界面重繪導致的閃屏從而極大降低用戶體驗的問題,出現了以下圖片處理技術:(1)雙緩沖技術[1]。其原理是在內存中開辟一塊與顯示設備環境相兼容的內存區域,將處理及繪制圖片等相對耗時的操作放在內存區域中,即先在內存區域中處理及繪制圖片,然后將繪制完成的圖形通過位塊傳輸法[1]拷貝到真正的顯示設備環境輸出。基于該原理的圖形處理技術,對于避免閃屏有非常明顯的效果,并且編程較為簡單。雙緩沖技術的加速原理是利用內存繪圖操作的高速性[2],從而解決界面閃屏的現象。但是,在實際使用雙緩沖技術繪圖過程中,出現的另一個費時環節是在內存兼容位圖和圖形顯示設備位圖格式之間的轉換。為了解決這個問題,從雙緩沖技術又衍生出了緩存位圖技術[3]。(2) 緩存位圖技術[4]。緩存位圖技術通過使用GDI+(Graphics Device Interface Plus)圖形設備接口提供的CachedBitmap類[5],創建一個使用特定圖形輸出設備格式來存儲指定位圖數據的緩存位圖對象,從而節省格式轉換的時間[5]。(3)圖像分塊處理技術[6]。圖像分塊處理技術中最常用的是九宮格圖像分塊技術[7],其原理是:先將大圖片分割為相同寬高的九小塊,然后再按照需要分別顯示圖像的一塊或者幾塊,從而把顯示大圖片的問題轉化為顯示小圖片,在根源上解決界面重繪導致的閃屏問題[7]。然而,這樣的技術應用十分有限,只適用于不需要完整顯示大圖片的情形[8]。如電子地圖、海洋遙感影像,用戶在特定的時間,只關心地圖或影像中的一部分[8],即在特定的時間,顯示相應的圖片分塊。
上述三種典型的圖片處理技術在處理小型圖片時都可以取得不錯的效果。其中圖像分塊處理技術在電子地圖和海洋遙感影像等領域也能較完善地解決界面重繪導致的閃屏問題。但是,在其它領域處理大圖片或圖像的時候,直接應用圖像分塊處理技術處理大圖片或圖像則無法達到預期效果。而使用雙緩沖技術和緩存位圖技術又會出現如下問題:(1)由于圖片規模較大,導致創建與顯示設備環境兼容的位圖不能清楚地顯示圖片的每一個細節;(2)在使用雙緩沖繪圖時,每次重繪都要將所有處理指令執行一遍,對于大圖片時耗太大[9,10]。為此國內國防科技大學的竇強、周興銘及武漢科技大學的張哲源等人在雙緩沖的基礎上研究了多層緩沖條件下的消息最大響應時間[11],提出多層緩沖技術構想,衍生出目前應用較為廣泛的三層緩沖技術[12],在一定程度上解決了軟件層面因顯示和操作大圖片而引發的閃屏和系統阻塞等問題。
然而,現有傳統的三層緩沖技術主要針對繪圖指令過于復雜時只使用雙緩沖技術無法滿足需求的情況,因而在雙緩沖的基礎上再添加一層內存緩沖,并借此避免出現閃屏的現象[10]。但是,該技術添加的內存緩沖都是與顯示設備兼容的,并且,對于每次界面重繪,該技術仍需要將所有處理指令重新執行一遍,在重繪大圖片的時候仍會消耗大量的時間,造成系統出現阻塞。因此,傳統的三層緩沖技術已無法滿足大圖片處理需求。本文提出使用改進的三層緩沖技術來處理和顯示大圖片。
傳統的三層緩沖技術處理和顯示大圖片的主要問題在于界面重繪時會造成系統阻塞,其原因是在載入大圖片的時候,會產生一個明顯的耗時過程[4],而在界面重繪的時候,傳統的三層緩沖會將所有的指令重新執行一遍。本文提出的改進三層緩沖技術算法原理是:在內存中開辟一塊與大圖片屬性相兼容的內存區域,用于存放大圖片數據;然后再在內存中開辟另一塊與顯示設備環境相兼容的內存區域,用于執行其它的圖形處理指令;最后通過位塊傳輸法[1]將內存中的圖形依次拷貝到真正的顯示設備環境輸出。改進的三層緩沖技術與傳統技術的差異體現在以下幾個方面:(1)需要分別創建與大圖片屬性相兼容的內存區域和與顯示設備環境相兼容的內存區域;(2)在大圖片輸出完成之后僅僅釋放與顯示設備環境相兼容的內存區域,保留與圖片屬性相兼容的內存區域;(3)界面需要重繪時,直接使用之前保存的與圖片屬性兼容的內存區域,避免重新載入圖片,從而解決系統阻塞問題。
根據上述算法原理,本文提出改進三層緩沖技術,該技術在首次載入大圖片時的算法模型如圖1所示。其中,第一層緩沖將大圖片載入到與大圖片相兼容的內存位圖中,該過程會產生一定耗時。第二層緩沖將大圖片兼容的內存位圖轉換到與顯示設備相兼容的內存位圖中,并且讓其它繪圖指令直接在該位圖上執行。這層緩沖的功能與雙緩沖的內存位圖功能類似。第三層緩沖將內存中的圖像按照指定的縮放級別顯示到屏幕上。

Figure 1 First loaded model of the improved three level buffers technology圖1 改進三層緩沖技術首次載入模型
改進三層緩沖技術在界面重繪時的算法模型如圖2所示。圖2中第一層和第二層緩沖分別對應首次載入模型圖1中的第二層和第三層緩沖,也就是說,改進的三層緩沖技術在界面重繪時只需兩層(而非三層)緩沖支持。重繪界面時,該模型直接使用首次載入大圖片保存下來的內存位圖,避免重新載入大圖片,從而避免了在載入大圖片時造成的系統阻塞。

Figure 2 User interface redrawing model of the improved three level buffers technology圖2 改進三層緩沖技術界面重繪模型
基于上述算法模型,形成本文提出的改進三層緩沖技術算法流程,如圖3所示。

Figure 3 Algorithm flow chart of the improved three level buffers technology圖3 改進三層緩沖技術算法流程圖
在地質應用中,巖心是礦產資源勘探、地質開發研究工作的第一手資料[13]。從鉆孔中取出的巖心樣本,本身包含了豐富的地質信息,是地質工作者認知地下地層沉積、礦物成礦的最直接途徑,也是進一步研究地質構造和成礦預測的重要依據[14]。專業人員在巖心影像分析基礎上繪制鉆孔柱狀圖,并進行巖心信息化處理。由于數字化鉆孔柱狀圖可達100 MB,其數據容量遠超普通圖片規模,使用普通的圖片處理和顯示技術不能取得良好的效果,為此采用改進三層緩沖技術。基于上述算法流程,給出數字巖心圖片處理地質應用的關鍵解決代碼。
程序運行效果如圖4所示,圖4a為圖片整體效果,圖4b為圖片局部放大效果。實驗結果表明,基于改進三層緩沖技術在對圖片進行操作時,不會出現系統阻塞現象,并且能夠在放大之后完整顯示圖片的細節。
關鍵代碼如下。
CBitmapmemImg;
if (!memImgDC.m_hDC)
{
memImgDC.CreateCompatibleDC(dc);
}
if (alreadyLoad)
{
// 創建與圖片屬性兼容的內存位圖
memImg.CreateCompatibleBitmap(dc,imgMaxWidth,imgMaxHeight);
memImgDC.SelectObject(&memImg);
alreadyLoad= FALSE;
GraphicsdcPen(memImgDC.m_hDC);
dcPen.DrawImage(bkPic,0,0,imgMaxWidth,imgMaxHeight);
}
// 創建與顯示設備兼容的內存位圖
CDCmemBkDC;
CBitmapmemBk;
memBkDC.CreateCompatibleDC(dc);
memBk.CreateCompatibleBitmap(dc,windowSize.Width(),windowSize.Height());
memBkDC.SelectObject(&memBk);
GraphicsdcBrush(memBkDC.m_hDC);
dcBrush.DrawImage(bkImg,-13,-10,windowSize.Width()+26,windowSize.Height()+20);
memBkDC.SetStretchBltMode(HALFTONE);/*防止圖片失真*/
memBkDC.StretchBlt(viewPt.at(scaleIndex).x,
viewPt.at(scaleIndex).y,
viewSize.at(scaleIndex).cx,
viewSize.at(scaleIndex).cy,
&memImgDC,
0,
0,
imgMaxWidth,
imgMaxHeight,
SRCCOPY);
dc→BitBlt(0,0,windowSize.Width(),windowSize.Height(),&memBkDC,0,0,SRCCOPY);
memBk.DeleteObject();
memBkDC.DeleteDC();
程序運行效果如圖4所示。

Figure 4 Achieved results by the improved three level buffers technology圖4 改進三層緩沖技術實現的效果
為進一步測試算法性能,使用傳統三層緩沖技術和改進三層緩沖技術分別顯示一張大小為98.5 MB的鉆孔柱狀圖,并且分別執行一次圖片放大、縮小、上移、下移、左移、右移和復位的操作,平均時間如表1所示。

Table 1 Comparison of time consumption betweenthe two image display technologies
從表1可以得到,在大圖片被載入的時候,兩種技術載入時間幾乎相同,但是在執行圖片操作時間上有很大的差異。使用傳統三層緩沖技術,在每一次操作圖片的時候都需要重新載入圖片,因此操作用時和載入用時基本相同。而使用改進三層緩沖技術,在操作圖片的時候不需要重新載入圖片,因此操作用時大幅減少,從而避免系統阻塞,提高了用戶體驗。本文提出的改進三層緩沖技術算法解決了大圖片顯示和重繪時候的系統阻塞問題,因此其總的響應時間遠遠短于常規圖片顯示技術的。
針對數字巖心鉆孔柱狀圖的處理和顯示應用案例,使用本文提出的改進三層緩沖技術,取得了非常好的效果。需要進一步研究的問題主要有:在大圖片載入的時候,仍然有一個明顯的耗時過程。要解決這個問題,可以使用目前最新的圖形處理單元(GPU)[15],針對圖片格式在GPU上實現并行圖片解壓算法,替代傳統在CPU上實現的串行圖片解壓算法,其加速比可以達到1 000倍以上[16],從根源上解決大圖片載入造成的系統堵塞問題。另一個需要進一步研究的問題是:對于一些由遙感影像轉化生成,動輒上千兆的超大圖片,普通的臺式機已經無法為其創建必須的內存緩沖。為解決這個問題,可以結合圖像切片技術和硬件加速的方法[17],同時結合本文提出的改進三層緩沖技術以達到目的。
[1] Liu Yu,Wang Ming-hui.A study on high speed drawing of graphics and image in GDI+ based application [J].Advanced Display,2006,69(11):66-69.(in Chinese)
[2] Han Li-na, Shi Hao-su.Dealing with flicker problem about GDI with double buffering[J].Computer Engineering and Design,2006,27(17):3258-3260.(in Chinese)
[3] Olafsen E,Scribner K,David K.MFC Visual C 6.0 programming insider[M].Wang Jian-hua,Chen Yi-fei,Zhang Huan-sheng, Translation.Beijing:China Machine Press,2000:687-692.(in Chinese)
[4] Chand M.Graphics programming with GDI+[M].Boston:Addison Wesley Professional,2003:532-576.
[5] Eric W, Garrett C, Robinson S.GDI+ programming-creating custom controls using C#[M].Birmingham:WROX Press Ltd,2002:432-448.
[6] Campadelli P.Color image segmentation using hopfield net works[J].Image and Vision Computing,1997,15(3):161-166.
[7] Wei Hong-bo,Lü Zhen-su.A survey of image segmentation[J].Journal of Gansu Sciences,2004,16(2):19-24.(in Chinese)
[8] Sonka M,Hlavac V,Boyle R D.Image processing analysis and machine vision[M].Second Edition.Los Angeles:Thomson Learning and PT Press,2003:308-412.
[9] Pratt W K.Digital image processing[M].New Jersey:John Wiley Sons,2009:216-232.
[10] Serban L. GDI+ custom controls with Visual C#2005[M].Birmingham:Packet Publishing,2006:327-342.
[11] Dou Qiang,Zhou Xing-ming.A worst-case response time analysis algorithm of messages with multiple-buffering[J].Acta Electronica Sinica,2002,13(5):23-28.(in Chinese)
[12] Zhang Zhe-yuan,Xiong Qing-guo,Li Wen-xiang.Based on double buffering technology to solve game development in pictures updated problem[J].Information Technology,2011,12(8):12-16.(in Chinese)
[13] Wang Ya,Wu Xiao-hong,Luo Dai-sheng,et al.Design and implementation of core image database management system[J].Computer Knowledge and Technology,2004,20(2):5-8.(in Chinese)
[14] Zhang Jin-chang.Core drilling techniques and their applications in the exploration of mineral resources[J].Exploration Engineering(Rock & Soil Drilling and Tunneling),2009,36(8):1-6.(in Chinese)
[15] Garland M,Grand S L,Nickolls J.Parallel computing experiences with CUDA [J].IEEE Computer Society,2008,27
(8):13-28.
[16] Harada T. Real-time rigid body simulation on GPU[M].Boston:Addison Wesley Professional,2007:611-632.
[17] Hu Xiao-dan,Li Wen,Liu Hai-bo.A fast image region segmentation method based on Gaussion statistical model[J].Journal of Fujian Normal University(Natural Science Edition),2011,26(2):133-135.(in Chinese)
附中文參考文獻:
[1] 柳鈺,王明輝.基于GDI+的快速圖形圖像繪制技術研究[J].現代顯示,2006,69(11):66-69.
[2] 韓麗娜,石昊蘇.使用雙緩存來解決GDI下的閃爍問題[J].計算機工程與設計,2006,27(17):3258-3260.
[3] Olafsen E,Scribner K,David K.MFC Visual C 6.0編程技術內幕[M].王建華,陳一飛,張煥生,譯.北京:機械工業出版社,2000:687-692.
[7] 魏弘博,呂振肅.圖像分割技術縱覽[J].甘肅科學學報,2004,16(2):19-24.
[11] 竇強,周興銘.多重緩沖條件下消息最大響應時間算法的研究[J].電子學報,2002,13(5):23-28.
[12] 張哲源,熊慶國,李文翔.基于雙緩沖技術解決游戲開發中畫面更新問題[J].信息技術,2011,12(8):12-16.
[13] 王亞,吳曉紅,羅代升,等.巖心圖像數據庫管理系統的規劃設計與實現[J].電腦知識與技術,2004,20(2):5-8.
[14] 張金昌.地質巖心鉆探技術及其在資源勘探中的應用[J].探礦工程(巖土鉆掘工程),2009,36(8):1-6.
[17] 胡小丹,李文,劉海博.基于高斯統計模型的快速圖像區域分割方法[J].福建師范大學學報(自然科學版),2011,26(2):133-135.