中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Java > 用户界面
怎样使用Java Servlet动态生成图片详解
作者:佚名 时间:2006-09-21 08:07 出处:java-cn 责编:月夜寒箫
              摘要:怎样使用Java Servlet动态生成图片详解
在Web应用中,经常需要动态生成图片,比如实时股市行情,各种统计图等等,这种情况下,图片只能在服务器内存中动态生成并发送给用户,然后在浏览器中显示出来。

本质上,浏览器向服务器请求静态图片如JPEG时,服务器返回的仍然是标准的http响应,只不过http头的contentType不是text/html,而是image/jpeg而已,因此,我们在Servlet中只要设置好contentType,然后发送图像的数据流,浏览器就能正确解析并显示出图片。

在Java中,java.awt和java.awt.image包提供了基本的绘制图像的能力,我们可以在内存中绘制好需要的图形,然后编码成jpeg或其他图像格式,最后发送相应给浏览器即可。下面是使用Servlet动态创建图像的详细步骤:

1.创建BufferedImage对象,该对象存在内存中,负责保存绘制的图像;

2.创建Graphics2D对象,该对象负责绘制所需的图像;

3.当绘制完成后,调用com.sun.image.codec.jpeg包的JPEG编码器对其编码;

4.最后将编码后的数据输出至HttpResponse即可。

注意com.sun.image.codec.jpeg包位于JDK目录的rt.jar包中,它不是公开的API,需要将rt.jar复制到web应用程序的WEB-INF/lib下。

我们先创建一个最简单的Servlet:

public class CreateImageServlet
            extends HttpServlet
            {
             protected void doGet
            (HttpServletRequest request,
            HttpServletResponse response)
             throws ServletException,
            IOException
             {
              response.setContentType
            ("image/jpeg");
             }
            }

我们首先设置了response的contentType为image/jpeg,这样浏览器就可以正确识别。然后,创建一个大小为100x100的BufferedImage对象,准备绘图:

 

int width = 100;
            int height = 100;
            BufferedImage bi =
            new BufferedImage(width, height,
            BufferedImage.TYPE_INT_RGB);

接着,BufferedImage对象中获取Graphics2D对象并绘图:

 

Graphics2D g = bi.createGraphics();
            // 创建Graphics2D对象
            // 填充背景为白色:
            g.setBackground(Color.BLUE);
            g.clearRect(0, 0, width, height);
            // 设置前景色:
            g.setColor(Color.RED);
            // 开始绘图:
            g.drawLine(0, 0, 99, 99);
            // 绘制一条直线
            // 绘图完成,释放资源:
            g.dispose();
            bi.flush();

然后,对BufferedImage进行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();
            }

编码后的JPEG图像直接输出到了out对象中,我们只要传入response. getOutputStream()就可以直接输出到HttpResponse中。

下面是完整的代码:

 

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.*;
            /**
            * @author Liao Xue Feng
            */
            public class CreateImageServlet
            extends HttpServlet
            {
             protected void doGet
            (HttpServletRequest request,
            HttpServletResponse response)
             throws ServletException,
            IOException
             {
              response.setContentType
            ("image/jpeg");
              createImage(response.getOutputStream());
             }
             private void createImage(OutputStream out)
            {
              int width = 100;
              int height = 100;
              BufferedImage bi =
            new BufferedImage(width, height,
            BufferedImage.TYPE_INT_RGB);
              Graphics2D g = bi.createGraphics();
              // set background:
              g.setBackground(Color.BLUE);
              g.clearRect(0, 0, width, height);
              // set fore color:
              g.setColor(Color.RED);
              // start draw:
              g.drawLine(0, 0, 99, 199);
              // end draw:
              g.dispose();
              bi.flush();
              // encode:
              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();
              }
             }
            }

最后将这个Servlet编译,注册到web.xml中,映射路径为/CreateImage,写一个简单的index.html测试:

 

<html><head></head>
            <body>
            <img src="CreateImage">
            </body></html>

如能正确显示,那么就大功告成了。

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有