GDI+與GDI比較

    現將自己關於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+效率比較
   可以參看關於GDI和GDI+中繪圖函數的速度的研究只把比較結果貼出來:
 
1、對於24位圖像,能用GDI就別用GDI+,實在要用GDI+,就儘量用GdipDrawCachedBitmap。

2、需要透明繪製的時候,能湊合用AlphaBlend就別用GDI+。但是AlphaBlend在透明混合時會有問題。

3、直接繪製32位圖像時,GdipDrawImage和GdipDrawImagePoint儘量別用,耗時多,功能少,得不償失。而GdipDrawImageRect和GdipDrawImageRectRect的耗時相當。GdipDrawCachedBitmap沒有速度優勢,而且有Bug,比雞肋還不如,還是捨棄吧。

4、24位、32位圖像,帶Alpha繪製時,AlphaBlend會自動優化,不需要對alpha=255的情況特殊處理;而對於GdipDrawImageRectRect來說,Alpha=255的情況一定要特殊處理,耗時的差距實在太大(應該是因爲傳入hImageAttributes與否而影響耗時)。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章