使用Java Servlet动态生成图片

罗丶我好想你

罗丶我好想你

2016-02-19 15:36

今天图老师小编给大家精心推荐个使用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,这样浏览器就可以正确识别。

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  然后,创建一个大小为100x100的BufferedImage对象,准备绘图:

  

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

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  接着,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>

  如能正确显示,大功告成!

展开更多 50%)
分享

猜你喜欢

使用Java Servlet动态生成图片

编程语言 网络编程
使用Java Servlet动态生成图片

Java Servlet及Cookie的使用

Java JAVA基础
Java Servlet及Cookie的使用

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

使用servlet和Java Bean访问MySQL

编程语言 网络编程
使用servlet和Java Bean访问MySQL

asp动态生成wbmp图片的程序

ASP
asp动态生成wbmp图片的程序

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

从Java应用程序动态生成PDF文件

编程语言 网络编程
从Java应用程序动态生成PDF文件

使用Resin3.0配置运行Java Servlet

编程语言 网络编程
使用Resin3.0配置运行Java Servlet

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

Win10如何用命令清空全部账号的回收站

Win10如何用命令清空全部账号的回收站

CentOS使用split命令分割文件的实例

CentOS使用split命令分割文件的实例
下拉加载更多内容 ↓