在Web應用中經常需要動態生成圖片比如實時股市行情各種統計圖等等這種情況下圖片只能在服務器內存中動態生成並發送給用戶然後在浏覽器中顯示出來
本質上浏覽器向服務器請求靜態圖片如JPEG時服務器返回的仍然是標准的http響應只不過http頭的contentType不是text/html而是image/jpeg而已因此我們在Servlet中只要設置好contentType然後發送圖像的數據流浏覽器就能正確解析並顯示出圖片
在Java中javaawt和javaawtimage包提供了基本的繪制圖像的能力我們可以在內存中繪制好需要的圖形然後編碼成jpeg或其他圖像格式最後發送相應給浏覽器即可下面是使用Servlet動態創建圖像的詳細步驟
.創建BufferedImage對象該對象存在內存中負責保存繪制的圖像
.創建GraphicsD對象該對象負責繪制所需的圖像
.當繪制完成後調用comsunimagecodecjpeg包的JPEG編碼器對其編碼
.最後將編碼後的數據輸出至HttpResponse即可
注意comsunimagecodecjpeg包位於JDK目錄的rtjar包中它不是公開的API需要將rtjar復制到web應用程序的WEBINF/lib下
我們先創建一個最簡單的Servlet
public class CreateImageServlet extends HttpServlet { protected void doGet(HttpServletRequest reque
st HttpServletResponse response) throws ServletException IOException { responsesetContentTy
pe("image/jpeg"); }}
我們首先設置了response的contentType為image/jpeg這樣浏覽器就可以正確識別然後創建一個大小為x的BufferedImage對象准備繪圖
int width = ;int height = ;BufferedImage bi = new BufferedImage(width height BufferedImageTY
PE_INT_RGB);
接著BufferedImage對象中獲取GraphicsD對象並繪圖
GraphicsD g = bicreateGraphics();// 創建GraphicsD對象// 填充背景為白色gsetBackground(ColorBL
UE);gclearRect( width height);// 設置前景色gsetColor(ColorRED);// 開始繪圖gdrawLine(
);// 繪制一條直線// 繪圖完成釋放資源gdispose();biflush();
然後對BufferedImage進行JPEG編碼
JPEGImageEncoder encoder= JPEGCodeccreateJPEGEncoder(out);JPEGEncodeParam param = encoderge
tDefaultJPEGEncodeParam(bi);paramsetQuality(f false);encodersetJPEGEncodeParam(param);try{ enco
derencode(bi);}catch(IOException ioe){ ioeprintStackTrace();}
編碼後的JPEG圖像直接輸出到了out對象中我們只要傳入response getOutputStream()就可以直接輸出到HttpResponse中
下面是完整的代碼
package comcrackjeewebutil;import javaio*;import javaawt*;import javaawtimage*;import javaxser
vlet*;import javaxservlet*;import comsunimagecodecjpeg*;/*** @author Liao Xue Feng*/public cla
ss CreateImageServlet extends HttpServlet{ protected void doGet(HttpServletRequest request HttpServlet
Response response) throws ServletExceptionIOException { responsesetContentType("image/jp
eg"); createImage(responsegetOutputStream()); } private void createImage(OutputStream ou
t){ int width = ; int height = ; BufferedImage bi = new BufferedImage(width heig
ht BufferedImageTYPE_INT_RGB); GraphicsD g = bicreateGraphics(); // set background: gsetB
ackground(ColorBLUE); gclearRect( width height); // set fore color: gsetColor(ColorR
ED); // start draw: gdrawLine( ); // end draw: gdispose(); biflush(); // enc
ode: JPEGImageEncoder encoder = JPEGCodeccreateJPEGEncoder(out); JPEGEncodeParam par
am = encodergetDefaultJPEGEncodeParam(bi); paramsetQuality(f false); encodersetJPEGEn
codeParam(param); try { encoderencode(bi); } catch(IOException ioe) { ioeprintStackTrace(); } }}
最後將這個Servlet編譯注冊到webxml中映射路徑為/CreateImage寫一個簡單的indexhtml測試
<html><head></head><body><img src="CreateImage"></body></html>
如能正確顯示那麼就大功告成了
From:http://tw.wingwit.com/Article/program/Java/Javascript/201311/25496.html