熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Javascript >> 正文

怎樣使用Java Servlet動態生成圖片詳解

2013-11-23 18:16:48  來源: Javascript 

  在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
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.