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

Java 服務端動態生成柱狀圖 JPEG 圖片:BufferedImage 繪圖與 JPEGCodec 編碼實戰

     編輯:Java 相關知識

核心類結構

package web.images;

import java.io.*;
import java.util.*;
import com.sun.image.codec.jpeg.*;
import java.awt.image.*;
import java.awt.*;

public class ChartGraphics {
    BufferedImage image;

    public void createImage(String fileLocation) {
        try {
            FileOutputStream fos = new FileOutputStream(fileLocation);
            BufferedOutputStream bos = new BufferedOutputStream(fos);
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bos);
            encoder.encode(image);
            bos.close();
        } catch (Exception e) {
            System.out.println(e);
        }
    }

    public void graphicsGeneration(int h1, int h2, int h3, int h4, int h5) {
        final int X = 10;
        int imageWidth = 800;
        int imageHeight = 900;
        int columnWidth = 70;
        int columnHeight = 800;

        ChartGraphics chartGraphics = new ChartGraphics();
        chartGraphics.image = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_RGB);
        Graphics g = chartGraphics.image.getGraphics();

        // 背景
        g.setColor(Color.white);
        g.fillRect(0, 0, imageWidth, imageHeight);

        // 座標軸
        g.setColor(Color.black);
        g.drawLine(columnWidth + X, columnHeight - h5 - 50, columnWidth + X, columnHeight); // Y軸
        g.drawLine(columnWidth + X, columnHeight - h5 - 50, columnWidth + X - 10, columnHeight - h5 - 40); // Y箭頭左
        g.drawLine(columnWidth + X, columnHeight - h5 - 50, columnWidth + X + 10, columnHeight - h5 - 40); // Y箭頭右
        g.drawLine(750, columnHeight, columnWidth + X, columnHeight); // X軸
        g.drawLine(750, columnHeight, 740, columnHeight - 10); // X箭頭左
        g.drawLine(750, columnHeight, 740, columnHeight + 10); // X箭頭右

        // 柱狀條
        g.setColor(Color.yellow);
        g.fillRect(X + 1 * columnWidth + 10, columnHeight - h1, columnWidth, h1);
        g.fillRect(X + 2 * columnWidth + 20, columnHeight - h2, columnWidth, h2);
        g.fillRect(X + 3 * columnWidth + 30, columnHeight - h3, columnWidth, h3);
        g.fillRect(X + 4 * columnWidth + 40, columnHeight - h4, columnWidth, h4);
        g.fillRect(X + 5 * columnWidth + 50, columnHeight - h5, columnWidth, h5);

        // 輸出
        chartGraphics.createImage("D:\\leaderquery\\leaderqueryWeb\\web800\\images\\chart.jpg");
    }
}

關鍵技術點

  • 離屏繪圖:使用 BufferedImage.TYPE_INT_RGB 創建內存圖像,避免閃爍
  • Graphics 繪圖上下文:繪製背景、座標軸、箭頭、柱狀條
  • JPEG 編碼:JPEGCodec.createJPEGEncoder() 將內存圖像編碼為 JPEG 流
  • 坐標計算:柱狀條高度對應傳入參數,X 軸間距固定,Y 軸基線動態調整

擴展建議

  • 將圖片尺寸、顏色、字體提取為配置參數
  • 添加 g.drawString() 繪製刻度標籤與標題
  • 改用 ImageIO.write(image, "jpg", file) (JDK 1.4+) 替代已過時的 com.sun.image.codec.jpeg 包
  • 部署到 Servlet 中,直接輸出到 response.getOutputStream() 實現動態圖片服務

此示例展示了 Java 在服務端生成統計圖表的經典模式,代碼結構清晰,易於擴展為通用圖表組件。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved