怎样使用Java 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>

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索图像
, 对象
, 2d绘制
, response
, image
, encoder
, 对象图片java
, 动态映射详解
, 动态创建详解
, BufferedImage
java图片填充
java servlet详解、java动态代理详解、java动态代理机制详解、java动态生成html页面、java 动态生成类,以便于您获取更多的相关知识。

时间: 2024-09-08 03:49:52

怎样使用Java Servlet动态生成图片详解的相关文章

使用Java Servlet动态生成图片

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

深入Ajax代理的Java Servlet的实现详解_java

代码如下所示: 复制代码 代码如下: import java.io.IOException;import java.io.InputStream;import java.net.URL;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServlet;impor

java jdk动态代理详解_java

jdk动态代理要对一个类进行代理,被代理的类必须实现至少一个接口,并且只有接口中的方法才能被代理. jdk实现动态代理一般分为三步: 1. 编写接口和实现类. 2. 写一个处理器,该处理器实现InvocationHandler接口,该接口只有一个方法,其签名为public Object invoke(Object proxy, Method method, Object[] args)throws Throwable;可在该处理器的实现方法中,在方法调用前和调用后加入自己的代码,从而进行动态拦截

Tomcat与Java Web开发技术详解连载之一

web|详解 本章介绍如何在Tomcat上创建和发布Web应用.这里首先讲解Tomcat的目录结构以及Web应用的目录结构,接着介绍如何将HTML.Servlet.JSP和Tag Library部署到Web应用中,然后介绍把整个Web应用打包并发布的方法,最后介绍如何在Tomcat上配置虚拟主机. 本章侧重于讨论Web应用的结构和发布方法,所以没有对本章的Servlet和JSP的例子进行详细解释,关于Servlet和JSP的技术可以分别参考其它章节的内容. 2.1 Tomcat的目录结构 在To

Tomcat与Java Web开发技术详解连载之二

web|详解 2.2.4 部署HTML文件 在helloapp目录下加入index.htm文件,这个文件仅仅用来显示一串带链接的字符"Welcome to HelloApp", 它链接到login.jsp文件.以下是index.htm文件的代码: <html><head><title>helloapp</title></head><body ><p><font size="7"

Tomcat与Java Web开发技术详解连载之三

web|详解 2.2.8 创建并发布WAR文件 Tomcat既可以运行采用开放式目录结构的Web应用,也可以运行WAR文件.在本书配套光盘的sourcecode/chapter2/helloapp目录下提供了所有源文件,只要把整个helloapp目录拷贝到/webapps目录下,即可运行开放式目录结构的helloapp应用.在Web应用的开发阶段,为了便于调试,通常采用开放式的目录结构来发布Web应用,这样可以方便地更新或替换文件.如果开发完毕,进入产品发布阶段,应该将整个Web应用打包为WAR

Servlet开发入门(2) 一个Servlet程序运行详解

知道了Servlet的作用后,我们来看一个Servlet的程序运行实例,为什么要看运行实例呢?因为要想成功运行一个Servlet程序,需要配置一些文件. Servlet程序的编写 开发一个可以处理的HTTP请求的Servlet程序,肯定是要继承HttpServlet类,而且在自定义中Servlet类中至少还要覆写HttpServlet类中提供的doGet()方法,方法如下: public void doGet(HttpServletRequest req,HttpServletResponse

Android Fragment动态创建详解及示例代码_Android

Android Fragment 动态创建 Fragment是activity的界面中的一部分或一种行为.可以把多个Fragment组合到一个activity中来创建一个多界面并且可以在多个activity中重用一个Fragment.可以把Fragment任务模块化的一段activity,它具有自己的生命周期,接收它自己的事件,并可以在activity运行时被添加或删除. Fragment不能独立存在,它必须嵌入到activity中,而且Fragment的生命周期直接受所在的activity的影

JAVA 静态代理模式详解及实例应用_java

JAVA 静态代理模式 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问. 代理模式说白了就是"真实对象"的代表,在访问对象时引入一定程度的间接性,因为这种间接性可以附加多种用途. 在这实现代码之前,先讲一个简单的生活故事,我们都知道我们周边有很多公司有房屋买卖或租赁的业务,比如链家(LianJia),但链家本身是不存在任何实际房屋资产的,他所售卖租赁的房屋均需要房屋产权所有人(HomeMaster)提供,才得以实现公司的房源需求:同时公司要的卖房租房业务均需要公司