程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> 讓 Eclipse 插件程序具有二維作圖能力(1)

讓 Eclipse 插件程序具有二維作圖能力(1)

編輯:JAVA編程入門知識

  大多數 Java 開發人員同意 Swing/AWT 只有一個方面強於 Eclipse 平台的標准窗口小部件工具箱(Standard Widget Toolkit),這就是 Java 2D。直到現在仍然沒有容易的方法將 Java 2D 的快捷性能與 SWT 用戶界面組件的更強的可移植性、功能和性能集成到一起,但是這一點就會改變了。這本文中,向大家展示了在 SWT 組件和 Draw2D 圖形中繪制二維圖像有多容易。

  SWT (標准窗口小部件工具箱,Standard Widget Toolkit)是在 Eclipse 平台上使用的窗口小部件工具箱。它也可以作為 Swing/AWT 的一個重要替代產品,用於構建任何類型的 Java GUI 應用程序。隨著 Eclipse 平台在過去兩年裡的日趨流行,SWT 已經進入大家的視線,並且最近它已經開始在一些應用程序中取代 Swing/AWT。SWT 的流行源自這樣一個事實:它是跨平台的工具箱,利用了窗口小部件的本性,並有一個與 Swing 及其他現代工具箱同樣強大的功能。使用 SWT,就不用在可移植性、功能和性能之間做取捨了。

  事實上,Swing/AWT 只在一個方面明顯強於 SWT,這就是 Java 2D。Java 2D 是一個強大的 API,是在 JDK 1.2 中引入的。它使 Java 開發人員在 AWT 組件上繪制時可以使用復雜的二維變換(平移、旋轉、縮放、錯切等)。不幸的是,Java 2D 設計為只在 AWT 或者 Swing 工具箱上使用,而 SWT 還沒有提供這種擴展的二維能力。因此,許多開發人員發現他們必須選擇是在 Java 平台上使用 Java 2D 還是放棄它令人興奮的功能而使用 SWT。

  不過,在本文中您將了解到如何同時擁有這兩方面的好處。我將展示一個簡單的技術,利用該技術可以在 SWT 組件和 Draw2D 圖像上繪制 Java 2D 圖像。為了理解這個例子,讀者應當熟悉 Java 2D、AWT 和 SWT。具有一些 Eclipse 平台的 GEF(圖形編輯框架,Graphical Editing Framework)的經驗也是有幫助的。

  屏外圖像技術

  本文展示一種簡單的技術,利用該技術,您可以用 Java 2D 功能在任何 SWT 窗口小部件或者 Draw2D 圖像上繪制。為了彌補 SWT 上缺少 Java 2D 的不足,用一個屏外(offscreen)AWT 圖像接收 Java 2D 繪制操作,並將它們轉換為獨立於工具箱的像素值。再用另一個由 SWT 工具箱創建的 屏外圖像將這些像素信息繪制在任何 SWT 組件上。圖 1 顯示了 AWT 屏外圖像轉換為 SWT 圖像再繪制在 SWT 窗口小部件上的過程。

  圖 1. 屏外圖像技術允許在 SWT 上使用 Java 2D

  圖 1 中顯示的屏外 AWT 圖像被初始化為透明背景。然後對屏外圖像的圖形上下文調用 Java 2D 方法。像所有 AWT 圖像一樣,屏外圖像的圖形上下文自動支持 Java 2D。完成了所有特定於 Java 2D 的繪制後,提取 AWT 圖像的像素值並傳送到一個屏外 SWT 圖像中。然後用工具箱的 GC.drawImage(...) 方法在 SWT 組件上繪制這個 SWT 圖像,就像所有正常圖像一樣。

  我將在下面幾節中完成這個過程中的每一步。

  創建 AWT 屏外圖像

  對於 AWT 屏外圖像,要使用 java.awt.image.BufferedImage 實例。BufferedImage 是一個可以通過它的 API 訪問其像素數據的圖像。訪問到了圖像的像素值就可以在以後將它轉換為 SWT 圖像。

  構建一個 AWT 緩沖圖像的最簡單方法是使用構造函數 public BufferedImage(int width, int height, int imageType)。前兩個參數表明圖像具有的大小。第三個參數是指定要創建的圖像 類型 的常量。圖像類型 —— 可能的值是在類 BufferedImage 中聲明的常量 TYPE_XXX 之一 —— 表明像素值是如何存儲在圖像中的。在彩色圖像中一般使用以下幾種最重要的圖像類型:

  TYPE_BYTE_INDEXED:這種圖像類型的圖像將使用一個索引顏色模型。索引顏色模型的意思是圖像中使用的每一種顏色都是在一組顏色中索引的。像素值只包含這個像素的顏色在顏色模型中的索引。這種類型的圖像局限於 256 種顏色 —— 也就是顏色模型的大小。以這種方式存儲像素信息可以很緊湊地表示圖像,因為每一個像素都只用一個字節編碼。

  TYPE_INT_RGB:

  這種類型常量表明圖像使用直接顏色模型。直接顏色模型 的意思是每一個像素的值包含關於其顏色的完整信息。TYPE_INT_RGB 表明每一個像素都是用一個整數(四字節)編碼的。每一個像素中編碼的信息是這個像素所使用的顏色的紅、綠和藍(RGB)成分。每一種顏色成分都用一個字節編碼。因為整個像素值是用四個字節編碼的,所以有一個字節是未使用的。這種圖像的內部表示占用的內存是使用索引顏色模型的圖像的四倍,但是這種圖像可以使用的顏色數增加到了 1 百 60 萬(256 x 256 x 256)。

  TYPE_INT_ARGB:

  與 TYPE_INT_RGB 一樣,這種類型的圖像使用直接顏色模型並用四個字節編碼每一個像素。不同之處在於,這裡用 TYPE_INT_RGB 沒有使用的第四個字節表示像素的透明度,有時也稱為顏色的 alpha 成分。這種類型的圖像可以有透明的背景,也可以是半透明的。 為了讓屏外圖像技術可以工作,需要只將受到 Java 2D 繪制影響的像素傳送到 SWT 組件的表面。為了保證這一點,初始圖像必須有透明背景。因此,對於 AWT 屏外圖像,使用的緩沖圖像類型為 TYPE_INT_ARGB。

  繪制和提取圖像

  這個過程的下一步是用 Java 2D 繪制圖像。首先取得它的 Graphics2D 上下文。可以用方法 createGraphics2D() 或者調用 getGraphics() 做到這一點。在這個上下文上繪制將會自動修改圖像的像素數據。在繪制完成後,可以用方法 getRGB(int startX, int startY, int w, int h, int rgbArray, int offset, int scansize) 容易且高效地提取圖像的像素值。這個方法可以將圖像中矩形區域的像素數據傳輸到一個整數數組中。getRGB() 方法的參數如下:

  startX, startY 是要提取的區域左上角圖像的坐標

  w, h 是要提取的區域的寬度和高度

  rgbArray 是接收像素值的整數數組

  offset 是數組中接收第一個像素值的位置的索引。

  scansize 是圖像中相鄰兩行中具有相同行索引的像素的索引偏移值。如果這個值與要提取的區域的寬度相同,那麼一行的第一個像素就會存儲在數組中前一行最後一個像素後面的索引位置。如果這個值大於提取區域的寬度,那麼數組中,在一行最後和下一行開始之間就會有一些未使用的索引。

  存儲像素數據

  圖 2 顯示 BufferedImage.getRGB(...) 如何在提取了 AWT 圖像的矩形區域後填充整數緩沖區。圖中下面的部分表示整數緩沖區。每一個框表示緩沖區中包含一個像素 4 字節 ARBG 值的一個值。括號中的數字表示像素在圖像中的坐標。

  圖 2. 從 AWT 圖像中提取像素值 在這種情況下,不使用任何 offset,這意味著第一個像素將保存在緩沖區索引 0 的位置。scansize 的值取要提取的區域的寬度,這意味著提取的一行中的第一個像素會接著前一行的最後一個像素的緩沖區位置。使用這些參數,整數的緩沖區就一定會足夠大,可以包含 w*h 個整數。當每一個像素的顏色信息都存儲到了一個整數的簡單緩沖區後,就可以將這些信息傳輸到 SWT 屏外圖像中。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved