Web 應用常需動態產生圖表、驗證碼、即時圖形。Servlet 只需設定 Content-Type: image/jpeg,將 BufferedImage 繪製完成後經 JPEGImageEncoder 編碼輸出至 HttpServletResponse.getOutputStream(),瀏覽器即可直接顯示。
BufferedImage 做為離屏緩衝區。Graphics2D 進行繪圖 (線條、文字、形狀)。com.sun.image.codec.jpeg.JPEGCodec 編碼為 JPEG。response.getOutputStream()。package com.crackj2ee.web.util;
import java.io.*;
import java.awt.*;
import java.awt.image.*;
import javax.servlet.*;
import javax.servlet.http.*;
import com.sun.image.codec.jpeg.*;
public class CreateImageServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setContentType("image/jpeg");
createImage(resp.getOutputStream());
}
private void createImage(OutputStream out) {
int w = 100, h = 100;
BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
Graphics2D g = bi.createGraphics();
// 背景
g.setBackground(Color.BLUE);
g.clearRect(0, 0, w, h);
// 前景
g.setColor(Color.RED);
g.drawLine(0, 0, 99, 99);
g.dispose();
bi.flush();
// JPEG 編碼
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bi);
param.setQuality(1.0f, false);
encoder.setJPEGEncodeParam(param);
try { encoder.encode(bi); }
catch (IOException ioe) { ioe.printStackTrace(); }
}
}
web.xml:<servlet-mapping><url-pattern>/CreateImage</url-pattern></servlet-mapping>。<img src="CreateImage">。注意:com.sun.image.codec.jpeg 為 JDK 內部 API,Java 9+ 已移除。現代專案建議使用 javax.imageio.ImageIO.write(bi, "jpg", out) 標準 API。