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