什么是GDI
GDI是Graphics Device Interface的縮寫(xiě),含義是圖形設(shè)備接口,它的主要任務(wù)是負(fù)責(zé)系統(tǒng)與繪圖程序之間的信息交換,處理所有Windows程序的圖形輸出。
在Windows操作系統(tǒng)下,絕大多數(shù)具備圖形界面的應(yīng)用程序都離不開(kāi)GDI,我們利用GDI所提供的眾多函數(shù)就可以方便的在屏幕、打印機(jī)及其它輸出設(shè)備上輸出圖形,文本等操作。GDI的出現(xiàn)使程序員無(wú)需要關(guān)心硬件設(shè)備及設(shè)備驅(qū)動(dòng),就可以將應(yīng)用程序的輸出轉(zhuǎn)化為硬件設(shè)備上的輸出,實(shí)現(xiàn)了程序開(kāi)發(fā)者與硬件設(shè)備的隔離,大大方便了開(kāi)發(fā)工作。
1.引言
GDI+是
Windows XP中的一個(gè)
子系統(tǒng),它主要負(fù)責(zé)在顯示屏幕和打印設(shè)備輸出有關(guān)信息,它是一組通過(guò)
C++類(lèi)實(shí)現(xiàn)的應(yīng)用程序編程接口。顧名思義,GDI+是以前版本GDI的繼承者,出于兼容性考慮,Windows XP仍然支持以前版本的GDI,但是在開(kāi)發(fā)新應(yīng)用程序的時(shí)候,開(kāi)發(fā)人員為了滿(mǎn)足圖形輸出需要應(yīng)該使用GDI+,因?yàn)镚DI+對(duì)以前的Windows版本中GDI進(jìn)行了優(yōu)化,并添加了許多新的功能。
作為圖形設(shè)備接口的GDI+使得應(yīng)用程序開(kāi)發(fā)人員在輸出屏幕和打印機(jī)信息的時(shí)候無(wú)需考慮具體顯示設(shè)備的細(xì)節(jié),他們只需調(diào)用GDI+庫(kù)輸出的類(lèi)的一些方法即可完成圖形操作,真正的繪圖工作由這些方法交給特定的設(shè)備驅(qū)動(dòng)程序來(lái)完成,GDI+使得圖形硬件和應(yīng)用程序相互隔離.從而使開(kāi)發(fā)人員編寫(xiě)設(shè)備無(wú)關(guān)的應(yīng)用程序變得非常容易。
2.GDI+新增功能
(1)漸變的畫(huà)刷(Gradient Brushes)
GDI+允許用戶(hù)創(chuàng)建一個(gè)沿路徑或直線(xiàn)漸變的畫(huà)刷,來(lái)填充外形(shapes),路徑(paths),區(qū)域(regions),漸變畫(huà)刷同樣也可以畫(huà)直線(xiàn)、曲線(xiàn)、路徑,當(dāng)你用一個(gè)線(xiàn)形畫(huà)刷填充一個(gè)外形(shapes)時(shí),顏色就能夠沿外形逐漸變化。
(2)基數(shù)樣條函數(shù)(Cardinal Splines)
GDI+支持基數(shù)樣條函數(shù),而GDI不支持?;鶖?shù)樣條是一組單個(gè)曲線(xiàn)按照一定的順序連接而成的一條較大曲線(xiàn)。樣條由一系列點(diǎn)指定,并通過(guò)每一個(gè)指定的點(diǎn)。由于基數(shù)樣條平滑地穿過(guò)組中的每一個(gè)點(diǎn)(不出現(xiàn)尖角),因而它比用直線(xiàn)連接創(chuàng)建的路徑更精確。下面是分別使用兩種方法創(chuàng)建的圖形,一個(gè)使用基數(shù)樣條,一個(gè)使用直線(xiàn)。
(3)持久路徑對(duì)象(Persistent Path Objects)
在GDI中,路徑屬于設(shè)備描述表(DC),畫(huà)完后路徑就會(huì)被破壞。在GDI+中,繪圖工作由Graphics對(duì)象來(lái)完成,你可以創(chuàng)建幾個(gè)與Graphics分開(kāi)的路徑對(duì)象,繪圖操作時(shí)路徑對(duì)象不被破環(huán),這樣你就可以多次使用同一個(gè)路徑對(duì)象畫(huà)路徑了。
(4)變形和矩陣對(duì)象(Transformations & Matrix Object)
GDI+提供了矩陣對(duì)象,一個(gè)非常強(qiáng)大的工具,使得編寫(xiě)圖形的旋轉(zhuǎn)、平移、縮放代碼變得非常容易。一個(gè)矩陣對(duì)象總是和一個(gè)圖形變換對(duì)相聯(lián)系起來(lái),比方說(shuō),路徑對(duì)象(PATH)有一個(gè)Transform方法,它的一個(gè)參數(shù)能夠接受矩陣對(duì)象的地址,每次路徑繪制時(shí),它能夠根據(jù)變換矩陣?yán)L制。下面的圖形是一個(gè)圖形變換前后的例子,變換按照先縮放后旋轉(zhuǎn)完成。
(5)可伸縮區(qū)域(Scalable Regions)
GDI+ 在區(qū)域(regions)方面對(duì)GDI進(jìn)行了改進(jìn),在GDI中,Regions存儲(chǔ)在設(shè)備坐標(biāo)中,對(duì)Regions 唯一可進(jìn)行圖形變換的操作就是對(duì)區(qū)域進(jìn)行平移。而GDI+用世界坐標(biāo)存儲(chǔ)區(qū)域(Regions),允許對(duì)區(qū)域進(jìn)行任何圖形變換(譬如如圖所示的縮放),圖形變換以變換矩陣存儲(chǔ),下面例子是一個(gè)區(qū)域變換前后的例子(縮放、旋轉(zhuǎn)、平移)
(6)Alpha Blending(混合)
你可能會(huì)注意到上面顯示的圖形,紅色未平移區(qū)域與變換后區(qū)域有一部分交叉區(qū)域,這一部分形成的夢(mèng)幻效果就是由GDI+支持的Alpha Blending(混合)實(shí)現(xiàn)的,利用alpha融合,你可以指定填充顏色的透明度,透明顏色與背景色相互融合,填充色越透明,背景色顯示越清晰,下圖所示的四個(gè)橢圓被填充了同樣的顏色,但由于擁有不同的透明度而呈現(xiàn)不同的顯示效果。
(7)多種圖像格式支持.
圖像在圖形界面程序中占有舉足輕重的地位,GDI+除了支持BMP等GDI支持的圖形格式外,還支持JPEG(Joint Photographic Experts Group)、GIF(Graphics Interchange Format)、PNG(Exchangeable Image File)、TIFF(Tag Image File Format)等圖像格式,你可以直接在程序中使用這些圖片文件,而無(wú)需考慮它們所用壓縮算法。
(8)其它。
GDI+還將支持其它技術(shù),譬如重新著色、顏色校正、元數(shù)據(jù)、圖形容器,也許這些功能我們會(huì)在將來(lái)的WindowsXP或者M(jìn)icrosoft VisualStudio。Net中看到.
3.編程模式的改變
Device Contexts(設(shè)備描述表), Handles(句柄), 和 Graphics Objects(圖形對(duì)象)
如果你曾經(jīng)使用過(guò)GDI編寫(xiě)過(guò)應(yīng)用程序,你肯定對(duì)設(shè)備描述表(DC)的概念非常熟悉,設(shè)備描述表是Windows使用的一個(gè)數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)具體設(shè)備能力和與如何在設(shè)備上重繪一些項(xiàng)目的有關(guān)屬性信息。而且視頻設(shè)備的設(shè)備描述表還與特定的窗口有關(guān)。首先你必須獲得一個(gè)設(shè)備描述表句柄,然后在圖形繪制時(shí),你把這個(gè)句柄作為一個(gè)參數(shù)傳遞給GDI圖形繪制函數(shù)。當(dāng)然你也可以把它傳遞給獲得或設(shè)置設(shè)備描述表有關(guān)屬性的函數(shù)。
利用GDI+函數(shù),你不必使用句柄或者設(shè)備描述表。相反,你可以簡(jiǎn)單地創(chuàng)建一個(gè)圖形對(duì)象(Graphics),然后以你熟悉的面向?qū)ο蟮木幊谭绞秸{(diào)用它的方法即可,譬如myGraphicsObject.DrawLine(parameters)。Graphics對(duì)象是GDI+的核心,正如設(shè)備描述表是GDI的核心一樣,設(shè)備描述表(DC)和圖形對(duì)象(Graphics)在不同的環(huán)境下扮演著同樣的角色,發(fā)揮著類(lèi)似的作用,但是兩者也存在著本質(zhì)的不同。前者使用基于句柄的編程方法而后者使用面向?qū)ο蟮木幊谭椒ā?
圖形對(duì)象和設(shè)備對(duì)象一樣,與屏幕的顯示窗口有關(guān),它包含著與項(xiàng)目重繪有關(guān)的屬性信息(譬如平滑度),然而圖形對(duì)象并沒(méi)有像GDI那樣與Pen(畫(huà)筆)、Path(路徑)、Image(圖像)、Font(字體)等攪在一起。在GDI中,所有與繪圖有關(guān)的繪圖對(duì)象必須選入指定設(shè)備描述表中(使用SelectObject函數(shù)),才能被指定的設(shè)備描述表所使用。而在GDI+中,你只需把這些繪圖對(duì)象作為一個(gè)參數(shù)傳遞給圖形對(duì)象Graphics方法調(diào)用即可,每一個(gè)圖形對(duì)象所使用的繪圖工具至于它調(diào)用方法使用的參數(shù)有關(guān),它可以通過(guò)參數(shù)使用多種Pen和Brush繪圖,而不是與特定的筆和畫(huà)刷聯(lián)系在一起。
GDI是如何實(shí)現(xiàn)輸出的?
要想在屏幕或者其它輸出設(shè)備上輸出圖形或者文字,那么我們就必須先獲得一個(gè)稱(chēng)為設(shè)備描述表( DC:Device Context)的對(duì)象的句柄,以它為參數(shù),調(diào)用各種GDI函數(shù)實(shí)現(xiàn)各種文字或圖形的輸出。
設(shè)備描述表是GDI內(nèi)部保存數(shù)據(jù)的一種數(shù)據(jù)結(jié)構(gòu),此結(jié)構(gòu)中的屬性?xún)?nèi)容與特定的輸出設(shè)備(顯示器,打印機(jī)等)相關(guān),屬性定義了GDI函數(shù)的工作細(xì)節(jié),在稍后我們將看到如何使用TextOut函數(shù)輸出文字,在這里屬性確定了文字的顏色,x坐標(biāo)和y坐標(biāo)映射到窗口顯示區(qū)域的方式等。
設(shè)備描述表句柄一旦獲得,那么系統(tǒng)將使用默認(rèn)的屬性值填充設(shè)備描述表結(jié)構(gòu)。
如果有必要,我們可以使用一些GDI函數(shù)獲取和改變?cè)O(shè)備描述表中的屬性值。
微軟GDI+圖片漏洞
微軟在近日凌晨爆出有史以來(lái)最大的安全漏洞,通過(guò)該漏洞,攻擊者可以將木馬藏于圖片中,網(wǎng)民無(wú)論是通過(guò)瀏覽器瀏覽、還是用各種看圖軟件打開(kāi)、或者在即時(shí)聊天窗口、電子郵件、Office文檔里查看這些圖片,只要看了就會(huì)中招!哪怕只是看了一個(gè)QQ表情!其危害程度遠(yuǎn)遠(yuǎn)超過(guò)以往微軟公布過(guò)的任何安全漏洞。