在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 request HttpServletResponse response)throws ServletException IOException{responsesetContentType("image/jpeg");}}
我们首先设置了response的contentType为image/jpeg这样浏览器就可以正确识别然后创建一个大小为x的BufferedImage对象准备绘图
int width = ;int height = ;BufferedImage bi = new BufferedImage(width height BufferedImageTYPE_INT_RGB);
接着BufferedImage对象中获取GraphicsD对象并绘图
GraphicsD g = bicreateGraphics();// 创建GraphicsD对象// 填充背景为白色gsetBackground(ColorBLUE);gclearRect( width height);// 设置前景色gsetColor(ColorRED);// 开始绘图gdrawLine( );// 绘制一条直线// 绘图完成释放资源gdispose();biflush();
然后对BufferedImage进行JPEG编码
JPEGImageEncoder encoder= JPEGCodeccreateJPEGEncoder(out);JPEGEncodeParam param = encodergetDefaultJPEGEncodeParam(bi);paramsetQuality(f false);encodersetJPEGEncodeParam(param);try{encoderencode(bi);}catch(IOException ioe){ioeprintStackTrace();}
编码后的JPEG图像直接输出到了out对象中我们只要传入response getOutputStream()就可以直接输出到HttpResponse中
下面是完整的代码
package comcrackjeewebutil;import javaio*;import javaawt*;import javaawtimage*;import javaxservlet*;import javaxservlet*;import comsunimagecodecjpeg*;/*** @author Liao Xue Feng*/public class CreateImageServlet extends HttpServlet{protected void doGet(HttpServletRequest request HttpServletResponse response)throws ServletExceptionIOException{responsesetContentType("image/jpeg");createImage(responsegetOutputStream());}private void createImage(OutputStream out){int width = ;int height = ;BufferedImage bi = new BufferedImage(width height BufferedImageTYPE_INT_RGB);GraphicsD g = bicreateGraphics();// set background:gsetBackground(ColorBLUE);gclearRect( width height);// set fore color:gsetColor(ColorRED);// start draw:gdrawLine( );// end draw:gdispose();biflush();// encode:JPEGImageEncoder encoder = JPEGCodeccreateJPEGEncoder(out);JPEGEncodeParam param = encodergetDefaultJPEGEncodeParam(bi);paramsetQuality(f false);encodersetJPEGEncodeParam(param);try {encoderencode(bi);}catch(IOException ioe) {ioeprintStackTrace();}}}
最后将这个Servlet编译注册到webxml中映射路径为/CreateImage写一个简单的indexhtml测试
<html><head></head><body><img src="CreateImage"></body></html>
如能正确显示那么就大功告成了