1. 程式人生 > >GDI+與GDI的區別簡介

GDI+與GDI的區別簡介

合成 creat 特性 dos 發送 use 單獨 使用 修正

一、GDI   GDI是位於應用程序與不同硬件之間的中間層,這種結構讓程序員從直接處理不同硬件的工作中解放出來,把硬件間的差異交給了GDI處理。GDI通過將應用程序與不同輸出設備特性相隔離,使Windows應用程序能夠毫無障礙地在Windows支持的任何圖形輸出設備上運行。例如,我們可以在不改變程序的前提下,讓能在Epson點式打印機上工作的程序也能在激光打印機上工作。它把windows系統中的圖形輸出轉換成硬件命令然後發送給硬件設備。GDI是以文件的形式存儲在系統中,系統需要輸出圖形時把它載入內存,如果轉換成硬件命令時遇到非GDI命令,系統還可能載入硬件驅動程序,驅動程序輔助GDI把圖形命令轉換成硬件命令。

二、設備環境   Windows系統是用來給應用程序提供設備獨立性的工具,它是windows系統為了處理輸出設備而使用的一種內部數據結構,設備環境是windos程序,驅動程序,和輸出設備(如打印機,繪圖儀)之間的紐帶,GDI是一組C++類,它在驅動程序的協助下把數據描繪在硬件上,它位於應用程序與硬件之間,把數據從一方傳到另一方。在Visual Studio .NET中Micro$oft解決了GDI中的許多問題,並讓它變得易用,GDI的.net版本叫做GDI+。

三、GDI+   GDI+是GDI的下一個版本,它進行了很好的改進,並且易用性更好。GDI的一個好處就是你不必知道任何關於數據怎樣在設備上渲染的細節,GDI+更好的實現了這個優點,也就是說,GDI是一個中低層API,你還可能要知道設備,而GDI+是一個高層的API,你不必知道設備。例如你如果要設置某個控件的前景和背景色,只需設置BackColor和ForeColor屬性。

四、編程模式的變化 “GDI uses a stateful model, whereas GDI+ uses a stateless”——GDI是有狀態的,GDI+是無無狀態的。

1、不再使用設備環境或句柄   在使用GDI繪圖時,必須要指定一個設備環境(DC),用來將某個窗口或設備與設備環境類的句柄指針關聯起來,所有的繪圖操作都與該句柄有關。而GDI+不再使用這個設備環境或句柄,取而代之是使用Graphics對象。與設備環境相類似,Graphics對象也是將屏幕的某一個窗口與之相關聯,並包含繪圖操作所需要的相關屬性。但是,只有這個Graphics對象與設備環境句柄還存在著聯系,其余的如Pen、Brush、Image和Font等對象均不再使用設備環境。

2、Pen、Brush,Font,Image等對象是圖形對象獨立的   畫筆對象能與用於提供繪制方法的圖形對象分開創建於維護,Graphics繪圖方法直接將Pen對象作為自己的參數,從而避免了在GDI使用SelectObject進行繁瑣的切換,類似的還有Brush、Path、Image和Font等。

3、“當前位置”   GDI繪圖操作(如畫線)中總存在一個被稱為"當前位置"的特殊位置。每次畫線都是以此當前位置為起始點,畫線操作結束之後,直線的結束點位置又成為了當前位置。設置當前位置的理由是為了提高畫線操作的效率,因為在一些場合下,總是一條直線連著另一條直線,首尾相接。有了當前位置的自動更新,就可避免每次畫線時都要給出兩點的坐標。盡管有其必要性,但是單獨繪制一條直線的場合總是比較多的,因此GDI+取消這個"當前位置"以避免當無法確定"當前位置"時所造成的繪圖的差錯,取而代之的是直接在DrawLine中指定直線起止點的坐標。   

4、繪制和填充   GDI總是讓形狀輪廓繪制和填充使用同一個繪圖函數,例如Rectangle。輪廓繪制需要一個畫筆,而填充一個區域需要一個畫刷。也就是說,不管我們是否需要填充所繪制的形狀,我們都需要指定一個畫刷,否則GDI采用默認的畫刷進行填充。這種方式確實給我們帶來了許多不便,現在GDI+將形狀輪廓繪制和填充操作分開而采用不同的方法,例如DrawRectangle和FillRectangle分別用來繪制和填充一個矩形。   

5、區域的操作   GDI提供了許多區域創建函數,如:CreateRectRgn、CreateEllpticRgn、CreateRoundRectRgn、CreatePolygonRgn和CreatePolyPolygonRgn等。誠然,這些函數給我們帶來了許多方便。但在GDI+中,由於為了便於將區域引入矩陣變換操作,GDI+簡化一般區域創建的方法,而將更復雜的區域創建交由Path接管。由於Path對象是與設備環境分離開來的,因而可以直接在Region構造函數中加以指定。

五、GDI+新特色 GDI+與GDI相比,增加了下列新的特性:

1、漸變畫刷   以往GDI實現顏色漸變區域的方法是通過使用不同顏色的線條來填充一個裁剪區域而達到的。現在GDI+拓展了GDI功能,提供線型漸變和路徑漸變畫刷來填充一個圖形、路徑和區域,甚至也可用來繪制直線、曲線等。這裏的路徑可以視為由各種繪圖函數產生的軌跡。   

2、樣條曲線   對於曲線而言,最具實際意義的莫過於樣條曲線。樣條曲線是在生產實踐的基礎上產生和發展起來的。模線間的設計人員在繪制模線時,先按給定的數據將型值點準確地"點"到圖板上。然後,采用一種稱為"樣條"的工具(一根富有彈性的有機玻璃條或木條),用壓鐵強迫它通過這些型值點,再適當調整這些壓鐵,讓樣條的形態發生變化,直至取得合適的形狀,才沿著樣條畫出所需的曲線。如果我們把樣條看成彈性細梁,那麽壓鐵就可看成作用在這梁上的某些點上的集中力。GDI+的Graphics:: DrawCurve函數中就有一個這樣的參數用來調整集中力的大小。除了樣條曲線外,GDI+還支持原來GDI中的Bezier曲線。

3、獨立的路徑對象   在GDI中,路徑是隸屬於一個設備環境(上下文),也就是說一旦設備環境指針超過它的有效期,路徑也會被刪除。而GDI+是使用Graphics對象來進行繪圖操作,並將路徑操作從Graphics對象分離出來,提供一個GraphicsPath類供用戶使用。這就是說,我們不必擔心路徑對象會受到Graphics對象操作的影響,從而可以使用同一個路徑對象進行多次的路徑繪制操作。

4、矩陣和矩陣變換   在圖形處理過程中常需要對其幾何信息進行變換以便產生復雜的新圖形,矩陣是這種圖形幾何變換最常用的方法。為了滿足人們對圖形變換的需求,GDI+提供了功能強大的Matrix類來實現矩陣的旋轉、錯切、平移、比例等變換操作,並且GDI+還支持Graphics圖形和區域(Region)的矩陣變換。

5、Alpha通道合成運算   在圖像處理中,Alpha用來衡量一個像素或圖像的透明度。在非壓縮的32位RGB圖像中,每個像素是由四個部分組成:一個Alpha通道和三個顏色分量(R、G和B)。當Alpha值為0時,該像素是完全透明的,而當Alpha值為255時,則該像素是完全不透明。      Alpha混色是將源像素和背景像素的顏色進行混合,最終顯示的顏色取決於其RGB顏色分量和Alpha值。它們之間的關系可用下列公式來表示   顯示顏色 = 源像素顏色 X alpha / 255 + 背景顏色 X (255 - alpha) / 255 GDI+的Color類定義了ARGB顏色數據類型,從而可以通過調整Alpha值來改變線條、圖像等與背景色混合後的實際效果。

6、多圖片格式的支持   GDI+提供了對各種圖片的打開,存儲功能。通過GDI+,我們能夠直接將一幅BMP文件存儲成JPG或其它格式的圖片文件。   除了上述新特性外,GDI+還將支持重新著色、色彩修正、消除走樣、元數據以及Graphics容器等特性。

GDI+與GDI的區別簡介