Java 2D API 是 AWT 的擴充套件,提供強大的二維圖形、文字與影像處理能力。本範例展示如何使用 Graphics2D 繪製基本圖形、設定繪圖屬性,並將結果匯出為 JPEG 圖片檔案。
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();
}
}
}
Java 2D 使用用戶座標系(浮點數精度),渲染時轉換為裝置座標系。RenderingHints.KEY_ANTIALIASING 啟用抗鋸齒,讓圖形邊緣更平滑。
BasicStroke 可自訂線條寬度、虛線模式、端點樣式。範例中使用 2 像素實線。顏色採用 RGB 隨機產生,展示動態視覺效果。
使用 ImageWriter 與 ImageWriteParam 精確控制 JPEG 壓縮品質(0.0~1.0),平衡檔案大小與影像品質。
BufferedImage 與 Graphics2D 物件WritableRaster 直接存取像素陣列