cairo 的目標是以跨平台的方式在打印機和屏幕上產生相同的輸出,它正在成為 Linux® 圖形領域的重要軟件。GNOME、GTK+、Pango 等許多軟件已經使用了它提供的 2D 功能。
1.cairo 的優點和用途
cairo 是一個免費的矢量繪圖軟件庫,它可以繪製多種輸出格式。cairo 支持許多平台,包括 Linux、BSD、Microsoft® Windows® 和 OSX(BeOS 和 OS2 後端也正在開發)。Linux 繪圖可以通過 X Window 系統、Quartz、圖像緩衝格式或 OpenGL 上下文來實現。另外,cairo 還支持生成 PostScript 或 PDF 輸出,從而產生高質量的打印結果。在理想情況下,cairo 的用戶可以在打印機和屏幕上獲得非常接近的輸出效果。
本文將向您介紹 cairo,以及它對應用程序的意義。本文的示例將產生一個 pdf、ps、png、svg 和 gtk 窗口,顯示的圖形是 IBM 徽標。
cairo 的一項主要設計目標是提供儘可能接近的輸出。這種一致的輸出使 cairo 非常適合 GUI 工具集編程和跨平台應用程序開發。使用同一個繪圖庫打印高分辨率的屏幕和繪製屏幕內容,這種功能具有顯著的優點。
另外,在支持的每種目標平台上,cairo 嘗試智能化地使用底層硬件和軟件支持。高質量矢量圖形和高性能的結合使 cairo 成為優秀的 UNIX® 繪圖系統。
cairo 是用 C 編寫的,但是為大多數常用的語言提供了綁定。選用 C 語言有助於創建新的綁定,同時在進行 C 語言調用時可以提供高性能。應該特別注意 Python 綁定,它支持快速原型開發,而且降低了學習 cairo 繪圖 API 的門檻。
計算機繪圖系統和體系結構很早就出現了,cairo 的設計借鑑了 PostScript 和 PDF 模型的許多經驗。cairo 之所以借鑑 PostScript 和 Portable Document Format(PDF)方法是因為,它們都使用數學語句定義圖像。由於用幾何方法表示圖像,所以可以在任何時候在一定範圍內計算幾何描述,從而重新創建整 個圖像(或一部分圖像)。圖形的幾何性質被表示為點、曲線和直線(這些元素構成了矢量)。
因為可以通過重新計算數學描述來重新繪製圖像或其組成部分,所以在對圖像進行放大、縮小或變換時不會出現分辨率損失。但是,矢量繪圖也有一些限 制。例如,如果對矢量圖像進行極高比例的縮放,超出了大多數人實際需要的範圍,就可能導致失真。在放大時,由於計算中要對誤差進行舍入,所以某些直線可能 看起來不正確。在縮小時,某些直線可能會無法看到或難以分辨。
cairo 採用矢量繪圖還有一個優點:矢量圖像往往比較小。這是因為用相當簡單的數學表達式就可以表達大量信息。矢量繪圖的優點是繪圖過程相當簡單。由繪圖庫負責將點、線以及相關表達式轉換為用戶可以看到的東西。
描述曲線的表達式稱為 Bezier 曲線或路徑,這個名稱源自數學家 Pierre Bezier。Bezier 曲線由至少兩個錨點(anchor point)組成,在錨點之間還有一個或多個點,這些點稱為控制點(handle)。移動控制點就可以改變曲線的形狀。如果您用過 Photoshop 或 GIMP 這樣的工具,那麼可能熟悉這種曲線。但是,在使用那些工具時,最終保存的圖形格式可能是位圖!文件的格式決定是否保留 Bezier 路徑信息,還是在給定的範圍內計算它並以位圖格式保存計算結果。
到編寫本文時,可用的 cairo 綁定包括 C++、Ruby、Perl、Java™ 語言和 .Net/mono 等等。這些綁定處於不同的開發狀態,成熟度各不相同;可以通過 cairo 項目主頁瞭解它們的最新情況(見 參考資料 中的鏈接)。目前,Python 和 C++ 綁定似乎在開放源碼社區中得到了廣泛採用。
正如前面提到的,一些圖形工具集也為 cairo 提供了綁定,這使 cairo 開發更加簡便了。2.8 之後的 Gtk+ 版本包含對 cairo 的完整支持,而且以後的 GTK 版本一直選用 cairo 作為基本繪圖系統。另外,GNUstep 和 FLTK 等工具集已經開始支持用 cairo 來滿足圖形呈現需求。
如果您打算進行任何跨平台開發,而且需要對繪圖操作和組合進行低層控制,那麼選用 cairo 作為繪圖 API 是非常合適的。如果需要跨平台功能,但是不需要低層繪圖控制,那麼可以使用在 cairo 之上構建的一些繪圖庫。
2.矢量繪圖與位圖繪圖
cairo 是一個矢量繪圖(vector drawing)庫,因此繪圖需要對圖形進行幾何描述,而不是描述位圖中填充的像素。在採用位圖繪圖(bitmap drawing)時,按照預先決定的佈局用預先決定的顏色填充一系列像素,而且圖形的質量與位圖的大小成正比。
在放大或修改位圖圖像時,位圖繪圖方法的效果就會變差。圖像常常會變得模糊,就像是近距離觀看背投電視或其他大屏幕電視時的效果。在某一距離 上,圖像可能看起來很清楚,但是靠近之後就會看到許多離散的點。因為數據無法定義預先定義的像素之間應該是什麼,所以放大時會很明顯地損失清晰度。
沒有留言:
張貼留言