Java 2D API - 1. 基本概念

 

Java 2D API擴展AWT包,對二維圖形、文本及成像功能提供了支持,可用於開發複雜的界面、繪圖軟件和圖像編輯器。Java 2D對象位於用戶座標空間(User coordinate space),當對象呈如今屏幕或打印機,用戶空間座標轉換爲設備空間座標(device space coordinate)。下面兩個類對 Java 2D API十分重要:java

  • Graphics
  • Graphics2D

 

Java 2D API提供了以下功能:編程

  • 爲顯示設備和打印機等提供了統一的渲染模型;
  • 提供了大量的幾何圖元(geometric primitive),如曲線(curves)、方形(rectangle)、橢圓(ellipse),幷包含幾乎可生成任何幾何圖形的機制;
  • 圖形、文本和圖像的hit detection 機制;
  • 用於重疊圖像對象渲染的混合模型;
  • 加強顏色支持;
  • 打印複雜的文檔;
  • 渲染的質量控制。

 

1. 座標系數組

Java 2D API 包含兩套座標空間:編輯器

  • 用戶空間(User space)  - 繪製圖形區域座標系統
  • 設備空間(Device space)  - 輸出設備如屏幕、窗口或打印機的座標系統

 

用戶空間是編程時所使用的座標空間,該座標體系是一個與設備無關的邏輯座標系統。佈局

用戶空間座標的原點在左上角,x座標向右遞增,y向下遞增,以下圖所示。全部的座標以整數指定(大多時候使用整數就足夠了,也提供了floatdouble支持)字體

clip_image001[4]

 

設備空間與具體設備相關,雖然屏幕座標系統和打印機的座標系統相差很大,可是對Java程序沒有任何影響,編程時徹底不用考慮。spa

 

2.  Java 2D 渲染code

Java 2D API爲不一樣設備提供了統一的渲染模型,無論目標設備是打印機仍是屏幕,渲染過程在API層次都是同樣的。當須要顯示某個組件,其paint() update() 方法都能以配置合適的Graphics 調用。orm

 

Graphics屬性:對象

  • Color: 當前繪製顏色(java.awt.Color)。全部的繪製,着色和純文本輸出都將以指定的顏色顯示;
  • Font:當前字體(java.awt.Font)。用於全部純文本輸出的字體。
  • Clipjava.awt.Shape類型,用於定義幾何形狀。該特性定義進行繪製的區域。一般這一形狀與整個圖形環境相同,但也不必定如此。
  • ClipBoundsjava.awt.Rectangle對象,表示包圍Clip屬性所需的Shape類型的最小矩形。只讀屬性。
  • FontMetricsjava.awt.FontMetrics只讀特性。該對象包含關於圖形環境中當前起做用的Font的信息。獲取該信息的機制被LineMetrics類取代。
  • Paint Mode:該特性控制環境使用當前顏色的方式。

 

Graphics2D類擴展Graphics類,提供了更多的圖形繪製功能。包括:

  • stroke paint屬性(draw方法),用於渲染幾何圖元的邊框;
  • paint 屬性 (fill方法),使用特定顏色或圖案填充圖形;
  • font 屬性,(drawString方法)渲染文本,經過font屬性將字符串轉換爲字形(glyph),而後經過paint屬性填充顏色或圖形;
  • 渲染圖像(drawImage方法)

另外,Graphics2D還包含Graphics的方法,如drawOval, fillRect

 

以上全部方法能夠分爲兩類:

  1. 繪製圖形的方法
  2. 渲染圖形的方法

 

第二類方法經過設置 Graphics2D 的屬性值實現如下渲染功能:

  • 改變筆畫寬度
  • 改變筆畫之間的鏈接方式
  • 指定須要渲染的區域
  • 對圖形進行平移、旋轉、縮放等
  • 設置圖形填充的顏色和圖案
  • 設置多個圖形組合的方式

 

要使用Graphics2D的功能,須要對 Graphics 進行強制轉換:

publicvoid paint(Graphics g){

Graphics2D g2 = (Graphics2D) g;

……

}

 

下面以具體圖形展現 Graphics2D 的不一樣特性:

clip_image002[4]

pen屬性,應用於圖形邊框。該stroke屬性容許以任意的點尺寸(point size)、虛線模式(dashing pattern) 、末端連接方式繪製線條。

clip_image003[4]

fill屬性,用於圖形內部。該paint屬性支持以純色、漸變色或圖紋等不一樣方式填充圖形。

clip_image004[4]

compositing屬性,用於重合對象的渲染、

clip_image005[4]

transform屬性,將渲染對象從用戶空間轉換爲設備空間時應用的屬性。包括平移、渲染、縮放等。

clip_image006[4]

clip屬性,經過Shape對象指定須要渲染區域的。

clip_image007[4]

font屬性,將文本轉換爲字形(glyphs)

clip_image008[4]

渲染建議(Rendering hints),在渲染的速度和質量間進行取捨。例如,你能夠指定是否使用反鋸齒(antialiasing)

 

3. 幾何圖形

Java 2D API提供了點、線、矩形、弧線、橢圓、曲線等一套標準的幾何圖形。這些基本圖形都定義在 java.awt.gemo包中。任何其餘的形狀均可以經過這些基本圖形進行組合得到。

 

Shape 接口表示一個幾何圖形,包含邊框和內部區域。該接口定義的方法功能包括:描述和檢查二維幾何對象,支持曲線片斷和圖形子片斷,而Graphics類只支持直線片斷。

 

下面是對java.awt.geom 包中各個類的簡介。

(AffineTransform, Arc2D, Area, CubicCurve, Dimension2D, Ellipse2D, FlatteningPathIterator, GeneralPath, Line2D, Path2D, QuadCurve, Rectangle2D, RectangularShape, RoundRectangle2D)

clip_image009[4]

 

黃色部分是遺留類。

 

3.1 Points

Point2D 類定義了一個 (x,y) 座標空間的點。在Java 2D API "point"不等價於 pixel"point" 沒有面積,不包含顏色,而且不能被渲染。

Points 用於建立其餘的圖形。 Point2D中包含一個計算兩點之間距離的方法。

 

3.2 Lines

Line2D 是用於表示「線」的抽象類。線的座標能夠用 double 表示。Line2D類包含多個用於設置「線」終點的方法。也可使用GeneralPath 類建立直線。

 

3.3 Rectangular Shapes

Rectangle2D, RoundRectangle2D, Arc2DEllipse2D 圖元都擴展自 RectangularShape 類,該類實現了Shape接口。

clip_image010[4]

 

3.4 Quadratic and Cubic Curves (二次和三次曲線)

QuadCurve2D 用於建立二次曲線。二次曲線經過兩個端點和一個控制點定義。

CubicCurve2D 類用於建立三次曲線。三次曲線經過兩個端點和兩個控制點定義。

二次曲線

clip_image011[4]

三次曲線

clip_image012[4]

 

3.5 Arbitrary Shapes

GeneralPath類可用於建立任意形狀。該類經過指定圖形的邊框建立任意形狀。如,下圖用三條直線和一條三次曲線建立曲線:

clip_image013[4]

 

3.6 Areas

經過Area類,能夠對兩個Shape 對象執行布爾操做,如(合併、交叉、相減)。該技術,也被稱爲區域幾何學(Constructive area geometry),可用來迅速建立複雜的圖形。

 

4. 文本(Text)

Java 2D API包含許多文本渲染功能,如字符串渲染,字體設置以及文本佈局。

繪製靜態字符串方法:調用Graphics 類的 drawString方法。經過Graphics setFont方法指定字體。

 

若是你須要實現本身的文本編輯程序,或須要更好的控制文本的佈局,則可使用 java.awt.font包中的類。

 

4.1 字體(Fonts)

字體中字符的形狀的表示稱爲字形(glyph)。單個字符或多個字符可能以一個或多個glyph表示。例如, á可能以兩個glyph表示,而連字fi則可能以一個glyph表示。

 

能夠將字體(font)看作是一個glyph集合。一個字體能夠包含多個屬性(faces),如斜體(italic)、常規(regular)和加粗等,單個字體的不一樣faces具備相似的排版特性,所以能夠看作是同一字體的成員。換句話說,特定風格的字形(glyph)集合構成一個font facefont face集合構成一個font familyfont family集合構成一個計算機上可用的全部字體。

 

Java 2D API經過Font實例指定字體。經過以下方法能夠得到當前系統全部可用字體:

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();

String[] fonts = ge.getAvailableFontFamilyNames();

for (String s : fonts) {

System.out.println(s);

}

 

4.2 文本佈局(Text Layout)

在顯示文本前,必須對其進行排版,以合適的字形顯示對應的字符。下面是Java 2D 管理文本佈局的兩種機制:

  • TextLayout管理文本佈局(text layout),文本高亮(highlighting)hit detectionTextLayout可用於處理大部分狀況,包括混合字體文本、混合語言和雙向文本等。
  • 能夠用於Font類建立本身的GlyphVector對象,而後使用Graphics2D類渲染GlyphVector。如此可以徹底控制文本的形狀和位置。

 

4.3 文本的渲染建議(Rendering Hints for Text)

Java 2D API 經過rendering hints控制圖形和文本渲染的質量。Rendering hints封裝在java.awt.RenderingHints類中。

對文原本說,該功能指反鋸齒(也稱爲平滑邊角)。例如,KEY_TEXT_ANTIALIASING可單獨用於文本的平滑處理。

 

5. 圖像(Images)

Java2D API中,一張圖片就是一個矩形的像素二維數組,每一個像素(pixel)表示特定位置的顏色,而維度表示圖片的寬度和高度。

 java.awt.image.BufferedImage是表示圖片最重要的類。Java2D API 經過BufferedImage表示圖片將其載入內存,從而能夠直接訪問。

可直接建立BufferedImage,也能夠經過載入外部圖片(PNGGIF)建立BufferedImage

不論是哪一種方式,Java2D API都容許在圖片上進行繪製。因此,圖形不侷限於攝影類型圖片,也包含弧線、文本甚至其餘的圖片,均可以繪製在一張圖片上,以下所示:

clip_image014[4]

 

Java 2D API容許對BufferedImage進行過濾,而且內置了許多過濾器。例如,ConsolveOp 過濾器可用於模糊(blur)或銳化(sharpen) 圖片。處理後的圖片能夠輸出到屏幕上,打印出來或者輸出爲PNGGIF等格式進行保存。

 

6. 打印(Printing)

全部的Swing Java 2D 圖像(graphics), 包括複合(composited)圖形圖像,均可以經過Java2D Printing API處處到打印機。該API 還提供了組成文本的功能,從而能夠對打印進行控制,如改變頁面打印順序等。

輸出到打印機和輸出到屏幕相似:打印系統控制頁面什麼時候打印,繪製系統控制一個組件什麼時候在屏幕顯示。

 

Java 2D Printing API 的打印系統使用callback模型控制頁面的打印。經過應用程序提供待打印文本,打印系統控制什麼時候對頁面進行打印。

 

下面的兩個特性對支持打印十分重要:

  • 任務控制(Job control) - 用於發起和控制打印任務,包括顯示標準打印和設置對話框。
  • 頁碼導航(Pagination) - 在打印系統發出請求時,渲染每一個頁面。

 

當須要將頁面圖像化,打印系統以特定配置的Graphics調用應用的 print 方法。要使用Java 2D API特性,須要將Graphics 轉換爲Graphics2D,和繪圖時同樣。

相關文章
相關標籤/搜索