C++矢量圖形庫系列(轉)

轉自:http://blog.sina.com.cn/s/blog_4265e1760100lg03.html html



     本系列篇章的主要內容是講解矢量圖形庫的編譯、開發和使用。並不對他們周邊的內容作過多的描述,如性能對比等。本人博客全部文章所有都是我的原創,並保留一切權利。不是原創的內容本人必定會註明「轉載」字樣。因此若是您須要轉載,請註明來源,謝謝。算法

矢量圖形,這是一個很是熟悉可是又讓人以爲陌生的東西。熟悉是由於聽得太多了,Flash就大量應用了矢量圖形技術,得以讓一段完整的動畫文件體積相比以逐幀圖片流的媒體格式要小得多,而且畫質無損,這也是在早期的互聯網上快速傳播開去讓用戶接受的基礎(文件體積不能太大,不然誰也沒有心思等着一點點的下載……)。陌生則是由於不少人搞了若干年的Win32軟件開發,翻來覆去就是MFC/GDI/Socket……,彷佛啥時也沒有矢量圖形技術的事情。緩存

    可是,不得不認可,Win32的GDI不管是在速度上仍是在功能上,都已是脫離時代了,因此GDI 滿有信心的出來了。有些人可能搞不太清楚GDI和GDI 的關係,我也常常聽到一些程序說用GDI 取代GDI。實際上的狀況是:GDI 不過是一套C 的庫,其底層仍舊與GDI有那麼點千絲萬縷的聯繫。若是說GDI能在不一樣的顯示設備上依據驅動而得到加速的話,GDI 就只能是依據不一樣的CPU平臺的運算速度而得到加速了——由於他是一套硬件無關的C 圖形庫,大量的圖形算法是其核心的內容。函數

     儘管GDI 出來已經有些年頭了,可是彷佛使用者卻很少(至少我沒有看見我身邊的朋友什麼的使用過)。我曾爲這個問題作過一些調查,有人說他用過GDI ,可是感受速度好像很慢,還不如本身寫的代碼。也有人說感受用不上,又不每天作畫圖軟件。還有人說GDI用習慣了,GDI 用着彆扭也沒發現啥優點…………的確,這些感受我也曾經存在過,因此我也不是太喜歡用GDI ,速度也的確不是太快——至少我本身作的GDI 畫圖板,在個人電腦1920*1080分辨率下全屏雙緩存連續填充圖形的時候,性能的確是不高(已經儘量的優化)。若是再用上ColorMatrix的話,我那可憐的四核也跟過了時的機器同樣,跑得實在困難。性能

     因此,我須要給各位介紹一些新的大牛了,其實也不是什麼新的東西,有些都是N久的名牌,穩定工做不少年,用於過不少的項目了。這些大牛們跟GDI 的功能上都極其相似(通常仍是會要多一些東西的),功能相似的意思是GDI 有的,他們均可以實現,他們有的,GDI 也均可以搞出來。但在性能上或者圖像質量上卻有着各不相同的表現了。好比大名鼎鼎的Cairo、AGG以及Google放出來的Skia(這三個從知名度上來說基本能夠算是三足鼎立了,呵呵),另外還有一些不太知名的(不知名不意味着他不強大),好比商業庫DISLIN,還有PHP用的GD等,甚至還有一些聯繫並不緊密的CImg(這個準確來說應當是屬於圖形處理庫,而不是矢量圖形庫了,可是不少網站都喜歡把他們列舉到一塊兒,嚴格來講的話,不太好理解)。優化

不過本系列篇章的主要目的,是說適量圖形庫,因此多餘的就不說了,咱們從Cairo開始提及。動畫

     大名鼎鼎的Cairo,官網:http://www.cairographics.org,開源社區的精品項目之一,已經基本上成爲了Linux下的圖形標準。Firefox的底層繪圖就是用的Cairo。關於Cairo更多的東西,Google一下吧,會比我說得更詳細,呵呵。網站

     AGG,官網:http://www.antigrain.com/,也是比較出名的矢量繪圖庫了,僅僅只是看官方站上的下載的Demo,都會有點酷酷的感受:)。使用起來與Cairo最大區別就是AGG更像是一堆未緊密聯繫的class,屬於弱藕合狀態,而且大量的使用了C 模板技術,從使用者的角度來看,AGG的難度是不小的,由於他只是給你提供了一系列的功能塊,怎麼組合使用,還全在用戶本身,而Cairo則提供了相對比較簡單明瞭的C函數接口。所以也就出現了AggPlus項目,他的目的就是把AGG包裝一次,而且是使用的仿GDI 相似接口。若是使用AggPlus的話,有GDI 相關經驗的就容易使用了,不過貌似性能也就有了不小的降低。google

     關於Cairo和AGG的性能對比,Google一下就能找到詳細的內容,可是簡單的說一下,就繪圖方面的速度來看,個人經驗是Cairo的速度會比AGG快,尤爲是Cairo已經出了1.9版,提速較大。AGG則徹底依賴C ,沒有硬件加速。他比較聰明的一個地方就是在光柵的時候使用了整數運算而不是浮點數運算。AGG在官網上宣稱其生成的圖像質量要比GDI 高,從個人實際使用經驗來看也的確是這樣的。這個Google也能找到實例,本處再也不多說。code

最後是Skia。其實Skia是本來應該是商業項目,讓Google收購以後給開源了,官網:http://code.google.com/p/skia/,受權形式是Apache 2.0,這個受權形式比較的爽,呵呵。Skia的速度不在Cairo和AGG之下,而接口形式的複雜度相對Cairo稍微高一點,比AGG要容易。功能則基本上沒有太大的差異。不過若是要說代碼的清晰度的話,Skia也是這3個項目中最好的,我很快就能熟悉Skia的代碼並對其作出我所須要的修改。因此目前我我的是比較喜歡Skia的。從Cairo轉到AGG再轉到Skia,如今就一直使用Skia了。

     在這些矢量圖形庫裏,有一些東西是你們通常都支持可是GDI 沒有的,好比對於SVG或PostScript的支持,好比你們均可以跨平臺但GDI 不能夠等等。另外,Cairo還有一個很明顯的優勢是其它一些庫所不具有的,就是Cairo支持數量衆多的Backends,其實就是BackBuffer或者叫DrawTarget的東西,Cairo能夠直接把要繪製的內容畫到Win32 GDI Bitmap/DC、PDF、SVG、PostScript、OpenGL、Printer等衆多的Target上,這是Cairo的一大特點,聽說也是Firefox選擇Cairo的一個重要理由。若是你的應用程序是須要將圖形內容繪製到各類各樣不一樣的Target的時候,選擇Cairo的確能夠省掉很多的事情。

     好了,亂談就到此爲止吧。本篇是開篇,下一篇,咱們將一塊兒來嘗試使用VC來編譯Cairo(1.8.x版),這是一切使用的大前提嘛,畢竟用VC在Win32上作軟件開發的仍是多數的。可是編譯Cairo就讓很多人碰到了問題。因此咱們先解決了編譯的問題,包括再下一篇我計劃講解Skia在VC上的編譯。編譯出了Lib/DLL,使用起來才能自由嘛C++矢量圖形庫系列(1)——矢量圖形庫亂談

相關文章
相關標籤/搜索