GIF動畫附加碼的例子JAVA版本

GIF動畫附加碼的例子JAVA版本

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,呵呵~