解决了,应该使用JPEGImageDecoder,而不是什么ImageIO。哦耶,散分!
解决方案 »
- hibernate中Criteria查询中的问题??
- 新开一帖!如何用java正则表达式 匹配非注释的字符串!
- 求助!
- 关于SVN的导入Error
- java 保存txt文件问题 在线等(急)
- 如果说我的Conn 很大的话,是不是有性能上的问题
- 请教一个移位运算的方法(此题属讨论题)
- 在myeclipse运行tomcat7源码报错PermGen
- 高分求jtds驱动连接MSSQL中文问题。
- 能问一下,javax.ejb.Stateless类是在哪个包里边吗?
- 主要是散分,深入说明rmi或jndi。或可说明在j2ee中的作用!本人满意给30-50分,顶给2-4分!!
- 有java项目开发经验者,欢迎加入我们的群!
* TestServlet.java
* 创建日期 2005-7-20
* 说明:
*/
package common.servlet;import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;/**
* TestServlet
* @author KeChuang <br>
* 说明:生成四位随机数字验证码,并生成验证码图片。
*/
public class AttachCode extends HttpServlet {
private Random random = new Random(); public static void main(String[] args) throws IOException {
BufferedImage image = new AttachCode().getImage("2234");
ImageIO.write(image, "JPEG", System.out);
} /*
* @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest,
* javax.servlet.http.HttpServletResponse)
*/
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType("image/jpeg");
HttpSession session = request.getSession(); String srand = getRand();
session.setAttribute("attachCode", srand);
System.out.println("---- random code is " + srand);
BufferedImage image = getImage(srand); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(response
.getOutputStream());
encoder.encode(image);
//response.sendRedirect("main.html");
} /**
* getRand <br>
* <b>说明: </b> 生成验证码字符串
* @return
*/
private String getRand() { int rnd = random.nextInt(10000);
if (rnd < 1000)
rnd = 9999 - rnd;
return String.valueOf(rnd);
} /**
* getImage <br>
* <b>说明: </b> 根据验证码字符串生成图片
* @param srand
* 要生成的验证码
* @return
*/
private BufferedImage getImage(String srand) {
int topmargin = 0;
int width = 55, height = 20 + topmargin;
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
//图片的背景比较明亮
g.setColor(Color.WHITE);
g.fillRect(0, 0, width, height);
g.setColor(getRandColor(220, 255, false));
g.fillRect(0, topmargin, width, height);
g.setFont(new Font("Arial", Font.BOLD, 20)); //绘制干扰线
for (int i = 0; i < 3; i++) {
g.setColor(getRandColor(20, 80, true));
int x = random.nextInt(width / 4);
int y = random.nextInt(height - topmargin) + topmargin;
int xl = random.nextInt(width / 4) + 3 * width / 4;
int yl = random.nextInt(height - topmargin) + topmargin;
g.drawLine(x, y, xl, yl);
}
for (int i = 0; i < 4; i++) {
g.setColor(getRandColor(20, 80, true));
g.drawString(srand.substring(i, i + 1), 13 * i + 3, 18 + topmargin);
}
g.dispose();
return image;
} /**
* getRandColor <br>
* <b>说明: </b> 给定范围获得随机颜色
* @param fc
* @param bc
* @return
*/
private Color getRandColor(int fc, int bc, boolean highlight) {
int hilight = -1;
if (highlight)
hilight = random.nextInt(3);
int[] c = new int[3];
for (int i = 0; i < 3; i++) {
c[i] = random.nextInt(bc - fc) + fc;
if (hilight == i) {
c[i] += 70;
if (c[i] > 255)
c[i] = 255;
}
}
return new Color(c[0], c[1], c[2]);
}
}