您的位置:首页 > 其它

生成图片彩色验证码(附带验证码旋转)

2012-02-24 19:50 471 查看
生成验证码图片一般返回InputStream类型,不管什么情况下都能使用,只需要将InputStream这个返回的值在写到文件里就能动态生成

代码如下:

package com.yxfei.tool;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.imageio.stream.ImageOutputStream;
import javax.servlet.http.HttpServletRequest;

public class Verifycode {

static Random r = new Random();
public static Color getRandColor(int min, int max) {

if (min > 255)
min = 255;
if (max > 255)
max = 255;
int red = r.nextInt(max - min) + min;
int green = r.nextInt(max - min) + min;
int blue = r.nextInt(max - min) + min;
return new Color(red, green, blue);
}

public static InputStream getVerifycode(int width,int height,HttpServletRequest request) throws Exception {
// TODO Auto-generated method stub
ByteArrayInputStream inputStream = null;
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
Graphics2D g2d = (Graphics2D) g;
g.setColor(getRandColor(200, 250));
g.fillRect(0, 0, width, height);
g.setColor(getRandColor(180, 200));
g.drawRect(0, 0, width-1, height-1);
for (int i = 0; i < 200; i++) {
int x = r.nextInt(width - 1);
int y = r.nextInt(height - 1);
int x1 = r.nextInt(width - 10)+10;
int y1 = r.nextInt(height - 4)+4;
g.setColor(getRandColor(180, 200));
g.drawLine(x,y,x1,y1);
}
for(int i=0;i<300;i++)
{
int x = r.nextInt(width);
int y = r.nextInt(height);
g.setColor(getRandColor(150,180));
g.drawRect(x, y, 0, 0);
}
String sRand = "",s = "";
int digital = 0;
int itmp = 0;
for (int i = 0; i < 4; i++) {
switch (r.nextInt(4)) {
case 0:
case 1:
digital = r.nextInt(26) + 65;
s = String.valueOf((char) digital);
break;
case 2:
digital = r.nextInt(26) + 97;
s = String.valueOf((char) digital);
break;
default:s = String.valueOf(r.nextInt(9));
}
sRand +=s;
Font mFont = new Font("Arial", Font.BOLD|Font.ITALIC, 25);
g.setFont(mFont);
boolean b = r.nextBoolean();
String a = b?"":"-";
int sin = Integer.parseInt(a+r.nextInt(20));
g.setColor(getRandColor(20, 130));
AffineTransform tr = new AffineTransform();
tr.rotate(sin*3.14/180, 15*i+6, b?5:(0));
g2d.setTransform(tr);
g.drawString(s, 16*i+10, 23);
}
System.out.println(sRand);
request.getSession(true).setAttribute("verifycode", sRand);
g.dispose();
ByteArrayInputStream input = null;
ByteArrayOutputStream output = new ByteArrayOutputStream();
try {
ImageOutputStream imageOut = ImageIO
.createImageOutputStream(output);
ImageIO.write(image, "JPEG", imageOut);
imageOut.close();
inputStream = new ByteArrayInputStream(output.toByteArray());
} catch (Exception e) {
System.out.println("验证码生成失败"+ e.toString());
}
return inputStream;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: