现在的位置: 首页 > 综合 > 正文

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

2016年02月27日 ⁄ 综合 ⁄ 共 2525字 ⁄ 字号 评论关闭

生成验证码图片一般返回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;
	}

}

抱歉!评论已关闭.