首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 2D 繪圖實戰範例:圖形繪製與圖片匯出

     編輯:Java 相關知識

Java 2D 繪圖 API 完整應用教學

Java 2D API 是 AWT 的擴充套件,提供強大的二維圖形、文字與影像處理能力。本範例展示如何使用 Graphics2D 繪製基本圖形、設定繪圖屬性,並將結果匯出為 JPEG 圖片檔案。

核心技術要點

  • Graphics2D:核心繪圖類別,提供抗鋸齒、筆觸、顏色等進階設定
  • BufferedImage:記憶體中影像緩衝區,支援離屏繪圖
  • ImageIO:標準影像輸入輸出 API,支援多種格式讀寫
  • BasicStroke:定義線條樣式(寬度、端點、連接樣式)

完整程式碼實作

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.IIOImage;
import javax.imageio.ImageWriteParam;
import java.util.Iterator;

public class Java2DDemo {
    public static void main(String[] args) throws IOException {
        int width = 800;
        int height = 800;

        // 建立記憶體影像緩衝區
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2d = image.createGraphics();
        
        // 設定背景色為白色
        g2d.setColor(Color.WHITE);
        g2d.fillRect(0, 0, width, height);
        
        // 啟用抗鋸齒提升繪圖品質
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        
        Random random = new Random();
        int prevX = 0, prevY = 0;
        
        // 繪製 10 個隨機節點與連線
        for (int i = 0; i < 10; i++) {
            int x = random.nextInt(width);
            int y = random.nextInt(height);
            
            // 隨機顏色
            g2d.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)));
            g2d.setStroke(new BasicStroke(2));
            
            // 繪製節點標籤與圓形
            g2d.drawString("Node " + i, x, y);
            g2d.drawArc(x, y, 20, 20, 0, 360);
            
            // 繪製連線(第一個節點除外)
            if (i != 0) {
                g2d.drawLine(prevX, prevY, x, y);
            }
            prevX = x;
            prevY = y;
        }
        
        // 釋放繪圖資源
        g2d.dispose();
        
        // 將影像寫入 JPEG 檔案
        saveAsJPEG(image, "C:/java2d_output.jpg");
        System.out.println("圖片已儲存至 C:/java2d_output.jpg");
    }
    
    /**
     * 將 BufferedImage 以 JPEG 格式儲存
     */
    private static void saveAsJPEG(BufferedImage image, String filePath) throws IOException {
        Iterator writers = ImageIO.getImageWritersByFormatName("jpg");
        if (!writers.hasNext()) {
            throw new IllegalStateException("找不到 JPEG ImageWriter");
        }
        
        ImageWriter writer = writers.next();
        ImageWriteParam param = writer.getDefaultWriteParam();
        param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
        param.setCompressionQuality(1.0f); // 最高品質
        
        try (ImageOutputStream output = ImageIO.createImageOutputStream(new File(filePath))) {
            writer.setOutput(output);
            writer.write(null, new IIOImage(image, null, null), param);
        } finally {
            writer.dispose();
        }
    }
}

關鍵技術解析

1. 座標系統與渲染提示

Java 2D 使用用戶座標系(浮點數精度),渲染時轉換為裝置座標系。RenderingHints.KEY_ANTIALIASING 啟用抗鋸齒,讓圖形邊緣更平滑。

2. 筆觸與顏色控制

BasicStroke 可自訂線條寬度、虛線模式、端點樣式。範例中使用 2 像素實線。顏色採用 RGB 隨機產生,展示動態視覺效果。

3. 影像編碼與壓縮

使用 ImageWriter 與 ImageWriteParam 精確控制 JPEG 壓縮品質(0.0~1.0),平衡檔案大小與影像品質。

常見應用場景

  • 報表圖表產生(長條圖、折線圖、餅圖)
  • 驗證碼圖片動態生成
  • 簡易繪圖工具開發
  • 影像水印添加與處理

效能優化建議

  1. 重複繪圖操作時,重用 BufferedImage 與 Graphics2D 物件
  2. 大量像素操作考慮使用 WritableRaster 直接存取像素陣列
  3. 生產環境建議使用連線池管理 ImageWriter 實例
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved