在 Java 圖形程式設計中,常需將 Graphics 或 Graphics2D 繪製的圖像儲存為 JPG 等常見圖片格式,以便後續查看、列印或網頁嵌入。
BufferedImage 作為離屏繪圖緩衝區Graphics2D 物件進行繪圖操作ImageIO.write() 輸出為 JPG 文件import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class GraphicsToJpg {
public static void main(String[] args) {
int width = 800, height = 600;
// 1. 建立支援透明度的 ARGB 圖像緩衝區
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = image.createGraphics();
try {
// 2. 開啟抗鋸齒提升畫質
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
// 3. 繪製背景
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, width, height);
// 4. 繪製範例圖形
g2d.setColor(new Color(0x3498DB));
g2d.fillRoundRect(100, 100, 200, 150, 20, 20);
g2d.setColor(Color.BLACK);
g2d.setFont(new Font("微軟正黑體", Font.BOLD, 32));
g2d.drawString("Java 繪圖", 130, 200);
// 5. 繪製座標軸
g2d.setStroke(new BasicStroke(2f));
g2d.setColor(Color.GRAY);
g2d.drawLine(50, 500, 750, 500); // X 軸
g2d.drawLine(50, 500, 50, 50); // Y 軸
} finally {
// 6. 釋放 Graphics 資源
g2d.dispose();
}
// 7. 輸出為 JPG(品質 0.9)
File output = new File("output.jpg");
try {
// 需轉換為 TYPE_INT_RGB 去除 Alpha 通道,否則 JPG 會變黑底
BufferedImage rgbImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
rgbImage.createGraphics().drawImage(image, 0, 0, null);
// 使用 JPEG 專用寫入參數控制品質
ImageIO.write(rgbImage, "jpg", output);
System.out.println("圖片已儲存至:" + output.getAbsolutePath());
} catch (IOException e) {
e.printStackTrace();
}
}
}
TYPE_INT_ARGB:繪圖時使用,支援透明度TYPE_INT_RGB:輸出 JPG 前必須轉換,JPG 不支援 Alpha 通道// 精確控制 JPEG 壓縮品質 (0.0f - 1.0f)
ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next();
ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionQuality(0.9f); // 90% 品質
try (ImageOutputStream ios = ImageIO.createImageOutputStream(output)) {
writer.setOutput(ios);
writer.write(null, new IIOImage(rgbImage, null, null), param);
}
g2d.dispose() 導致資源洩漏IOException 導致程式靜默失敗掌握此技術後,即可將任何 Java 2D 繪圖結果持久化為標準圖片檔,滿足列印、歸檔、Web 傳輸等多元需求。