使用Servlet动态生成图片

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>如能正确显示,大功告成!

时间: 2025-01-29 21:29:26

使用Servlet动态生成图片的相关文章

怎样使用Java Servlet动态生成图片详解

servlet|动态|详解 在Web应用中,经常需要动态生成图片,比如实时股市行情,各种统计图等等,这种情况下,图片只能在服务器内存中动态生成并发送给用户,然后在浏览器中显示出来. 本质上,浏览器向服务器请求静态图片如JPEG时,服务器返回的仍然是标准的http响应,只不过http头的contentType不是text/html,而是image/jpeg而已,因此,我们在Servlet中只要设置好contentType,然后发送图像的数据流,浏览器就能正确解析并显示出图片. 在Java中,jav

使用Java Servlet动态生成图片

servlet|动态 在Web应用中,经常需要动态生成图片,比如实时股市行情,各种统计图等等,这种情况下,图片只能在服务器内存中动态生成并发送给用户,然后在浏览器中显示出来. 本质上,浏览器向服务器请求静态图片如JPEG时,服务器返回的仍然是标准的http响应,只不过http头的contentType不是text/html,而是image/jpeg而已,因此,我们在Servlet中只要设置好contentType,然后发送图像的数据流,浏览器就能正确解析并显示出图片. 在Java中,java.a

uploadify3 2 1-uploadify3.2.1用formDate向servlet动态传递参数的问题,已经要崩溃了

问题描述 uploadify3.2.1用formDate向servlet动态传递参数的问题,已经要崩溃了 这个传的参数,在servlet怎么用request都取不到,官方文档的方案也不对,已经疯了.. $("#uploadify").uploadify({ 'auto' : true, 'swf' : 'js/uploadify.swf', 'folder' : '/uploads', 'uploader' : url, 'method' : 'GET', 'cancelImg' :

动态生成图片的开源包或者代码

问题描述 动态生成图片的开源包或者代码 大家是否知道输入数据能动态生成如下图片的第三方开源包或者代码. 求提供,谢谢! 解决方案 什么语言没有说 以.net为例:http://www.cnblogs.com/foundation/archive/2008/06/29/1232108.html 其它语言自己google下flowchart+你的语言 或者 流程图控件+你的语言 解决方案二: opencv,或者visio应该都行吧,office的visio做这个应该就行,或者java,python的

Servlet动态网页技术详解_JSP编程

一.Servlet简介:随着互联网技术的逐步普及,以及人们对互联网要求提高,以前那种静态网页已经不再是适应,我们看到今天的网页不但有flash,vide等等,显然以前的那种静态网页展示无法解决,为了解决这个问题,SUN公司提供了一门用于解决上述出现的问题的技术,这就是Servlet技术.Servlet是sun公司提供的一门用于开发动态web资源的技术.Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤

Servlet实现动态图文结合输出

servlet|动态 如果你是一个WEB开发者,或多或少会遇到这样一种情况:网页设计师在设计网页时,在需要动态输出内容的地方采用图片,如下图: 而\\\\"热点聚焦"这个名称,也许过一两天就要求改成"焦点访谈"等其它字样,到时不得不重新制作一张图片替代.而采用文字加背景,有时不易达到好的效果.采用表格背景图方式,需要精心调整表格的尺寸,而且其它的改动也会有意无意影响到它,需要小心调试. 本人在多个项目开发中遇到网页中需要动态图文结合输出情况,程序员和美工往往最终都是

控制动态servlet图形处理(1)

servlet|动态|控制|图形 控制世界-或者至少控制您的图像 作为一名站点开发人员或页面作者,迎合所有这些喜好是很困难的.要手工执行该工作,必须将站点上的每个图像转换成您的网站支持的图像大小.然后,需要调整站点上每个页面中的图像标记,使每个标记都正确地反映图像的大小.不能只更改 HTML img 标记的宽(width)和高(height),而不更改图像:这会导致低带宽用户下载大的图像,并在客户机端重新调整它的大小.如果提供了八个常用的图像大小,很容易可以看到每个图像将如何需要八个缩放大小,以

控制动态servlet图形处理(2)

servlet|动态|控制|图形 编写定制 JSP 标记 既然明白了 Web 服务器是如何处理 JSP 页面请求的,那么让我们研究一下如何实现定制 JSP 标记.注:JSP 标记既来自标准库(如 Java Standard Template Library,JSTL),也来自您自己编写的库(也称为定制标记).通常,定制标记处理特殊的问题领域.对本文而言,我们在处理如何管理图像.目前,Java 2 Extended Edition(J2EE)V1.2 和 V1.3 使用 JSP 规范 V1.2.在

如何用ServletJSP动态生成图像验证码

js|servlet|动态|验证码 现在有不少网站在用户填写表单时,同时要求填写验证码,验证码的一个目的就是防范一些恶意的网站下载软件,这些软件能通过遍历链接而将网站的所有网页下载.还可以防止用户不经过本网站的页面而使用网站的资源.所以现在有不少网站都使用了验证码技术,验证码通常是一个在WEB服务器上生成的随机字符串,同时以某种方式保存起来,比如保存到与当前的Session中,然后在用户提交网页时与用户输入的验证比较是否一致,然而如果直接以明文的方式,还是不能防范一些功能较强的自动填写表格的软件