java gif验证码_Java生成gif动画验证码 Java生成验证码

[java]代码库1. 验证码抽象类

import java.awt.*;

import java.io.OutputStream;

import static Randoms.num;

import static Randoms.alpha;

/**

*

验证码抽象类,暂时不支持中文

*

* @author: wuhongjun

* @version:1.0

*/

public abstract class Captcha

{

protected Font font = new Font("Verdana", Font.ITALIC|Font.BOLD, 28); // 字体

protected int len = 5; // 验证码随机字符长度

protected int width = 150; // 验证码显示跨度

protected int height = 40; // 验证码显示高度

private String chars = null; // 随机字符串

/**

* 生成随机字符数组

* @return 字符数组

*/

protected char[] alphas()

{

char[] cs = new char[len];

for(int i = 0;i

{

cs[i] = alpha();

}

chars = new String(cs);

return cs;

}

public Font getFont()

{

return font;

}

public void setFont(Font font)

{

this.font = font;

}

public int getLen()

{

return len;

}

public void setLen(int len)

{

this.len = len;

}

public int getWidth()

{

return width;

}

public void setWidth(int width)

{

this.width = width;

}

public int getHeight()

{

return height;

}

public void setHeight(int height)

{

this.height = height;

}

/**

* 给定范围获得随机颜色

* @return Color 随机颜色

*/

protected Color color(int fc, int bc)

{

if (fc > 255)

fc = 255;

if (bc > 255)

bc = 255;

int r = fc + num(bc - fc);

int g = fc + num(bc - fc);

int b = fc + num(bc - fc);

return new Color(r, g, b);

}

/**

* 验证码输出,抽象方法,由子类实现

* @param os 输出流

*/

public abstract void out(OutputStream os);

/**

* 获取随机字符串

* @return string

*/

public String text()

{

return chars;

}

}

2.png格式验证码

import javax.imageio.ImageIO;

import java.awt.*;

import java.awt.image.BufferedImage;

import java.io.IOException;

import java.io.OutputStream;

import static Randoms.num;

/**

*

png格式验证码

*

* @author: wuhongjun

* @version:1.0

*/

public class SpecCaptcha extends Captcha

{

public SpecCaptcha()

{

}

public SpecCaptcha(int width, int height)

{

this.width = width;

this.height = height;

}

public SpecCaptcha(int width, int height, int len){

this(width,height);

this.len = len;

}

public SpecCaptcha(int width, int height, int len, Font font){

this(width,height,len);

this.font = font;

}

/**

* 生成验证码

* @throws java.io.IOException IO异常

*/

@Override

public void out(OutputStream out){

graphicsImage(alphas(), out);

}

/**

* 画随机码图

* @param strs 文本

* @param out 输出流

*/

private boolean graphicsImage(char[] strs, OutputStream out){

boolean ok = false;

try

{

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

Graphics2D g = (Graphics2D)bi.getGraphics();

AlphaComposite ac3;

Color color ;

int len = strs.length;

g.setColor(Color.WHITE);

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

// 随机画干扰的蛋蛋

for(int i=0;i<15;i++){

color = color(150, 250);

g.setColor(color);

g.drawOval(num(width), num(height), 5+num(10), 5+num(10));// 画蛋蛋,有蛋的生活才精彩

color = null;

}

g.setFont(font);

int h = height - ((height - font.getSize()) >>1),

w = width/len,

size = w-font.getSize()+1;

/* 画字符串 */

for(int i=0;i

{

ac3 = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.7f);// 指定透明度

g.setComposite(ac3);

color = new Color(20 + num(110), 20 + num(110), 20 + num(110));// 对每个字符都用随机颜色

g.setColor(color);

g.drawString(strs[i]+"",(width-(len-i)*w)+size, h-4);

color = null;

ac3 = null;

}

ImageIO.write(bi, "png", out);

out.flush();

ok = true;

}catch (IOException e){

ok = false;

}finally

{

Streams.close(out);

}

return ok;

}

}

3.Gif验证码类

import Streams;

import java.awt.*;

import java.awt.image.BufferedImage;

import java.io.OutputStream;

import static Randoms.num;

/**

*

Gif验证码类

*

* @author: wuhongjun

* @version:1.0

*/

public class GifCaptcha extends Captcha

{

public GifCaptcha()

{

}

public GifCaptcha(int width,int height){

this.width = width;

this.height = height;

}

public GifCaptcha(int width,int height,int len){

this(width,height);

this.len = len;

}

public GifCaptcha(int width,int height,int len,Font font)

{

this(width,height,len);

this.font = font;

}

@Override

public void out(OutputStream os)

{

try

{

GifEncoder gifEncoder = new GifEncoder(); // gif编码类,这个利用了洋人写的编码类,所有类都在附件中

//生成字符

gifEncoder.start(os);

gifEncoder.setQuality(180);

gifEncoder.setDelay(100);

gifEncoder.setRepeat(0);

BufferedImage frame;

char[] rands =alphas();

Color fontcolor[]=new Color[len];

for(int i=0;i

{

fontcolor[i]=new Color(20 + num(110), 20 + num(110), 20 + num(110));

}

for(int i=0;i

{

frame=graphicsImage(fontcolor, rands, i);

gifEncoder.addFrame(frame);

frame.flush();

}

gifEncoder.finish();

}finally

{

Streams.close(os);

}

}

/**

* 画随机码图

* @param fontcolor 随机字体颜色

* @param strs 字符数组

* @param flag 透明度使用

* @return BufferedImage

*/

private BufferedImage graphicsImage(Color[] fontcolor,char[] strs,int flag)

{

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

//或得图形上下文

//Graphics2D g2d=image.createGraphics();

Graphics2D g2d = (Graphics2D)image.getGraphics();

//利用指定颜色填充背景

g2d.setColor(Color.WHITE);

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

AlphaComposite ac3;

int h = height - ((height - font.getSize()) >>1) ;

int w = width/len;

g2d.setFont(font);

for(int i=0;i

{

ac3 = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, getAlpha(flag, i));

g2d.setComposite(ac3);

g2d.setColor(fontcolor[i]);

g2d.drawOval(num(width), num(height), 5+num(10), 5+num(10));

g2d.drawString(strs[i]+"", (width-(len-i)*w)+(w-font.getSize())+1, h-4);

}

g2d.dispose();

return image;

}

/**

* 获取透明度,从0到1,自动计算步长

* @return float 透明度

*/

private float getAlpha(int i,int j)

{

int num = i+j;

float r = (float)1/len,s = (len+1) * r;

return num > len ? (num *r - s) : num * r;

}

}

4.Streams IO工具类

public class Streams

{

/**

* 关闭输入流

* @param in 输入流

*/

public static void close(InputStream in) {

if (in != null) {

try {

in.close();

} catch (IOException ioex) {

// ignore

}

}

}

/**

* 关闭输出流

* @param out 输出流

*/

public static void close(OutputStream out) {

if (out != null) {

try {

out.flush();

} catch (IOException ioex) {

// ignore

}

try {

out.close();

} catch (IOException ioex) {

// ignore

}

}

}

}

5.Randoms 随机数工具类

/**

*

随机工具类

*

* @author: wuhongjun

* @version:1.0

*/

public class Randoms

{

private static final Random RANDOM = new Random();

//定义验证码字符.去除了O和I等容易混淆的字母

public static final char ALPHA[]={'A','B','C','D','E','F','G','H','G','K','M','N','P','Q','R','S','T','U','V','W','X','Y','Z'

,'a','b','c','d','e','f','g','h','i','j','k','m','n','p','q','r','s','t','u','v','w','x','y','z','2','3','4','5','6','7','8','9'};

/**

* 产生两个数之间的随机数

* @param min 小数

* @param max 比min大的数

* @return int 随机数字

*/

public static int num(int min, int max)

{

return min + RANDOM.nextInt(max - min);

}

/**

* 产生0--num的随机数,不包括num

* @param num 数字

* @return int 随机数字

*/

public static int num(int num)

{

return RANDOM.nextInt(num);

}

public static char alpha()

{

return ALPHA[num(0, ALPHA.length)];

}

}

使用说明,web请用response的输出流

public static void main(String[] args) throws FileNotFoundException

{

Captcha captcha = new SpecCaptcha(150,40,5);// png格式验证码

captcha.out(new FileOutputStream("E:/1.png"));

captcha = new GifCaptcha(150,40,5);// gif格式动画验证码

captcha.out(new FileOutputStream("E:/1.gif"));

}

694748ed64b9390909c0d88230893790.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值