多數 Java 開發者公認 Swing/AWT 僅在 Java 2D 方面優於 Eclipse 標準窗口工具箱(SWT)。SWT 憑藉跨平台、高效能、原生外觀等優勢逐漸取代 Swing/AWT,但缺乏 Java 2D 的進階繪圖能力(平移、旋轉、縮放、錯切等複雜仿射變換)。本文系列將示範如何在 SWT 元件與 Draw2D 圖形上繪製 Java 2D 圖像,兼得兩者之長。
為彌補 SWT 缺乏 Java 2D 支援,採用「離屏渲染 → 像素轉換 → SWT 繪製」三階段流程:
BufferedImage 作為離屏畫布Graphics2D 執行 Java 2D 繪圖操作ImageDataImage 並透過 GC.drawImage() 繪製到目標元件
建構子:new BufferedImage(width, height, imageType)
| 類型常數 | 色彩模型 | 像素編碼 | 適用場景 |
|---|---|---|---|
| TYPE_BYTE_INDEXED | 索引色彩 | 1 byte(調色盤索引) | ≤256 色,記憶體緊湊 |
| TYPE_INT_RGB | 直接色彩 | 4 bytes(RGB + 1 byte 未用) | 1600 萬色,不透明背景 |
| TYPE_INT_ARGB | 直接色彩 + Alpha | 4 bytes(ARGB) | 支援透明/半透明,**離屏技術必選** |
離屏圖像必須使用 TYPE_INT_ARGB 並初始化為透明背景,確保僅傳輸 Java 2D 實際繪製的像素區域。
Graphics2D g2d = bufferedImage.createGraphics();
// 或
Graphics2D g2d = (Graphics2D) bufferedImage.getGraphics();
// 參數:起始座標、寬高、接收陣列、陣列偏移、掃描行跨度
bufferedImage.getRGB(startX, startY, w, h, rgbArray, 0, w);
getRGB 將指定矩形區域的 ARGB 像素值填入整數陣列,scansize = w 表示陣列緊湊排列(行尾無間隙)。
下一篇將詳細說明:
ImageData 結構與像素編碼規則(位元深度、調色盤、bytesPerLine、透明像素)Graphics2DRenderer 工具類原始碼與使用範例