`
ynshun
  • 浏览: 91537 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

请您先登录,才能继续操作

servlet自动生成图片【转载】

 
阅读更多

Web应用中,经常需要动态生成图片,比如实时股市行情,各种统计图等等,这种情况下,图片只能在服务器内存中动态生成并发送给用户,然后在浏览器中显示出来。 

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

  在Java中,java.awtjava.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");
 }
}


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

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


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

 

 

 

import java.io.*;

import java.util.*;

import com.sun.image.codec.jpeg.*;

import java.awt.image.*;

import java.awt.*;

public class GenGif {

BufferedImage image;

// 创建 jpg 文件到指定路径下

public void createJpg(String path) {

  try {

   FileOutputStream fos = new FileOutputStream(path);

   BufferedOutputStream bos = new BufferedOutputStream(fos);

   JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bos);

   encoder.encode(image);

   bos.close();

  } catch(FileNotFoundException fnfe) {

   System.out.println(fnfe);

  } catch(IOException ioe) {

   System.out.println(ioe);

  }

}

public static void main(String[] args) {

  int width=400, height=300;

  int xLength=300, yLength=150;

  int count=5;

  

  Vector data=new Vector();

  data.addElement(new Integer(100));

  data.addElement(new Integer(120));

  data.addElement(new Integer(150));

  data.addElement(new Integer(40));

  data.addElement(new Integer(5));

  

  GenGif jg = new GenGif();

  jg.image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

  Graphics g = jg.image.getGraphics();

  

  // 画坐标

  g.setColor(Color.white);

  g.fillRect(0, 0, width, height);

  g.setColor(Color.blue);

  g.drawLine(10,height-10,10,height-10-yLength);

  g.drawLine(10,height-10,10+xLength,height-10);

  // 连线

  int yTo;

  int yFrom = ((Integer)(data.elementAt(0))).intValue();

  for (int i=1; i<count; i++) {

   yTo=((Integer)(data.elementAt(i))).intValue();

   g.drawLine(10+i*xLength/count,height-10,10+i*xLength/count,height-15);

   g.drawLine(10+(i-1)*xLength/count,yFrom,10+i*xLength/count,yTo);

   yFrom=yTo;

  }

  

  jg.createJpg("c:/aaa.jpg");

}

}

分享到:
评论

相关推荐

    Java servlet 自动生成 图片验证码 生成 Java源码

    Java servlet 自动生成 图片验证码 生成 Java源码

    登陆验证+servlet动态生成图片验证码

    在IT行业中,登陆验证是确保用户安全性的重要环节,而动态生成的图片验证码是防止恶意自动登录和机器人攻击的有效工具。本文将深入探讨“登陆验证”与“Servlet动态生成图片验证码”的相关知识点,并提供实践指导。 ...

    Servlet生成图片验证码

    在这个场景中,我们使用Servlet来生成图片验证码,这是一种防止恶意自动化程序(如机器人)进行非法操作的安全机制。验证码通常是一串随机生成的字符,以图像形式显示,用户需要在输入框中正确输入才能完成验证。 ...

    java使用Servlet动态生成图片

    Java 使用 Servlet 动态生成图片 在 Web 应用中,经常需要动态生成图片,如实时股市行情、各种统计图等等。这种情况下,图片只能在服务器内存中动态生成并发送给用户,然后在浏览器中显示出来。本质上,浏览器向...

    servlet生成验证码图片

    `servlet`生成验证码图片是通过服务器端动态创建一个包含随机字符的图像,用户需要输入图像中显示的文字或数字来验证其身份。以下将详细解释这个过程及其相关知识点: 1. **Servlet**:Servlet是Java中用于扩展...

    使用Servlet生成图片验证码

    在"使用Servlet生成图片验证码"这个主题中,我们首先会创建一个Servlet来生成随机的字母和数字组合,通常包含4到6位。这可以通过Java的Random类和Character类来实现。验证码生成后,将其保存在服务器的内存中,以便...

    JSP中利用Servlet生成验证码图片

    本文将详细介绍如何在Java Server Pages (JSP) 和 Servlet 技术的基础上,实现一个简单而实用的验证码图片生成工具。 #### 一、验证码的基本概念 验证码(CAPTCHA)是一种区分计算机和人类的方法,常用于验证用户...

    servlet生成保存图片,压缩zip见附件

    2. **图片生成**:图片可以由Servlet动态生成,例如通过绘制文本、图形或验证码。这通常涉及使用Java的`java.awt`和`javax.imageio`包中的类,如`BufferedImage`和`Graphics2D`。 3. **文件保存**:生成的图片需要...

    用Servlet实现的二维码图片生成

    下面将详细解释如何通过Servlet实现二维码图片生成的原理和步骤。 首先,理解二维码的基本概念。二维码是一种二维条形码,可以存储比传统一维条形码更多的信息,如文本、网址、联系人信息等。它由黑白相间的模块...

    利用servlet动态生成验证码

    本教程主要讲解如何利用Servlet来实现动态生成验证码的功能,这对于防止机器人或恶意自动化程序在网站上进行非法操作至关重要。验证码通常由一串随机字符组成,用户需要正确输入才能完成特定操作,如注册、登录或...

    servlet动态生成登陆验证图片

    ### servlet动态生成登录验证图片详解 #### 背景与需求 在现代Web开发中,为了提高用户体验并增强安全性,动态生成图片成为一种常见的技术手段。例如,在登录页面上使用动态验证码图片可以有效防止机器人自动登录...

    java web笔记之servlet生成验证码

    验证码的主要目的是区分人类用户和自动化程序,通过要求用户输入图片上的文字或者完成简单的数学问题,来验证其为真实的人类。这有助于防止垃圾邮件、恶意注册、自动化攻击等网络安全问题。 二、Servlet简介 ...

    servlet生成四位数验证码图片

    在servlet中动态生成验证码图片,可被JSP或servlet引用,每次刷新都会改变验证码

    Tomcat JNDI 数据源 自动生成程序 Servlet 版

    Tomcat JNDI 数据源 自动生成程序 Servlet 版 本程序自动判断Tomcat版本,兼容tomcat 5.0、5.5、6.0等版本, 根据项目名自动生成 JNDI 配置文件,使程序员从手动配置JNDI数据源中解脱出来。 使用说明: 1、把...

    在JSP中显示servlet中生成的或读取的图片

    在JSP中显示Servlet生成或读取的图片是一项常见的任务,尤其在动态网站开发中,例如用户上传的图片处理、验证码生成等场景。本篇将详细介绍如何实现这一功能,涉及的知识点包括Java Servlet、JSP、HTTP协议以及文件I...

    自动生成静态网页技术+servlet实现

    在IT行业中,自动生成静态网页技术与Servlet的结合使用是一种高效的方法,特别是在处理高并发访问和提高网站性能时。Servlet是Java服务器端编程的一个重要组件,它允许开发者创建动态、交互式的Web应用。本篇文章将...

    Servlet生成动态验证码

    要生成动态验证码,首先需要在Servlet中创建一个`BufferedImage`对象,定义验证码的宽度和高度。然后,通过随机数生成器填充图像,可以绘制不同颜色的线条和字符,增加识别难度。使用`Random`类生成随机字符序列,...

    servlet生成验证码

    在IT领域,特别是Web开发中,验证码是一种常见的安全机制,用于区分...总之,使用JSP和Servlet技术生成验证码是一种有效提升Web应用安全性的方法,通过合理设计和实现,可以有效地抵御自动化攻击,保护用户数据安全。

Global site tag (gtag.js) - Google Analytics