GIF动画附加码,原来有一个PHP版本,但是最近项目用到JAVA所以废弃了PHP版本。
java版本核心类是Captcha类,代码如下:
package com.youqian.util.gifUtil;
import java.awt.*;
import java.io.OutputStream;
import com.meles.cn.Loadfont;
/**
* <p>验证码抽象类,暂时不支持中文</p>
*
* @author: wuhongjun
* @version:1.0
*/
public abstract class Captcha
{
//protected Font font = new Font("Verdana", Font.ITALIC, 28); // 字体
protected Font font = Loadfont.loadFont("D:/workspace440/springtest/CloudOcr/src/57868198CAI978_2.ttf",30f); // 自定义手写字体
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<len;i++)
{
cs[i] = Randoms.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 + Randoms.num(bc - fc);
int g = fc + Randoms.num(bc - fc);
int b = fc + Randoms.num(bc - fc);
return new Color(r, g, b);
}
/**
* 验证码输出,抽象方法,由子类实现
* @param os 输出流
*/
public abstract void out(OutputStream os);
/**
* 获取随机字符串
* @return string
*/
public String text()
{
return chars;
}
}
基本原理是调用了自定义字体,然后用Awt的方法生成动画。项目源代码下载:http://www.meles.cn/bbs/forum.php?mod=viewthread&tid=5461&page=1&extra=#pid9575
由于核心是字体库,所以选取一个合适的字体库就很重要了。如何考虑识别率高,可以采用标准的TrueType字库,比如:楷体,宋体。
为了防止人家识别和破解,我在网上找了一些诡异的字体,比如:娃娃体,手写体。
后来有一天我发现了一个更好玩的东东:FontCreator,这玩意可以自己编辑一个字体,原理基本就是你在白纸上画张字母,然后拍照,然后倒入到字体库中,设置好字体映射吗,就OK了!
有了这玩意,妈妈再也不担心我破解识别码了!
这里是我写的字母d,呵呵~