java生成动态gif格式与png格式的验证码(代码1)
来源:互联网 发布:hash算法的实现原理 编辑:程序博客网 时间:2024/05/01 20:27
- import java.awt.Color;
- import java.awt.Font;
- import java.io.OutputStream;
- import java.util.Random;
- /**
- * 验证码抽象类,暂时不支持中文
- * @author wzztestin
- *
- */
- public abstract class Captcha {
- private static final Random random = new Random();
- // 字体
- protected Font font = new Font("Verdana", Font.ITALIC | Font.BOLD, 28);
- // 默认宽度
- protected int width = 150;
- //默认高度
- protected int height = 40;
- //验证码串
- private String yanzhenmastr = "";
- //除数
- private String onenum = "";
- /**
- * 生成随机颜色
- * @param fc
- * @param bc
- * @return Color
- */
- Color getRandColor(int fc, int bc) {
- Random random = new Random();
- if (fc > 255) {
- fc = 255;
- }
- if (bc > 255) {
- bc = 255;
- }
- int r = fc + random.nextInt(bc - fc);
- int g = fc + random.nextInt(bc - fc);
- int b = fc + random.nextInt(bc - fc);
- return new Color(r, g, b);
- }
- /**
- * 生成随机字体
- * @return Font
- */
- Font getRandomFont() {
- String[] fonts = {"Georgia", "Verdana", "Arial", "Tahoma", "Time News Roman", "Courier New", "Arial Black", "Quantzite"};
- int fontIndex = (int)Math.round(Math.random() * (fonts.length - 1));
- int fontSize = 28;
- return new Font(fonts[fontIndex], Font.PLAIN, fontSize);
- }
- public String getOnenum() {
- return onenum;
- }
- public String getCzfu() {
- return czfu;
- }
- public String getTwonum() {
- return twonum;
- }
- //操作符
- private String czfu = "";
- //被除数
- private String twonum = "";
- public String getYanzhenmastr() {
- return yanzhenmastr;
- }
- protected int alpha = 5;
- public int getAlpha() {
- return alpha;
- }
- public void setAlpha(int alpha) {
- this.alpha = alpha;
- }
- /**
- * 生成随机字符数组
- *
- * @return 字符数组
- */
- protected String getVilidCode() {
- int numlength = random.nextInt(2)+1;
- for (int i = 0; i < numlength; i++) {
- char rnum = Randoms.getNum();
- yanzhenmastr = yanzhenmastr + rnum;
- onenum = onenum + rnum;
- }
- czfu = Randoms.getChaoZuoFu()+"";
- yanzhenmastr = yanzhenmastr + czfu;
- for (int i = 0; i < numlength; i++) {
- char rnum = Randoms.getNum();
- yanzhenmastr = yanzhenmastr + rnum;
- twonum = twonum + rnum;
- }
- yanzhenmastr = yanzhenmastr + "=?";
- return yanzhenmastr;
- }
- public Font getFont() {
- return font;
- }
- public void setFont(Font font) {
- this.font = font;
- }
- 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);
- }
- import java.io.IOException;
- import java.io.OutputStream;
- /**
- *
- * @author wzztestin
- * 图片编码器
- */
- public class Encoder {
- private static final int EOF = -1;
- private int imgW, imgH;
- private byte[] pixAry;
- private int initCodeSize;
- private int remaining;
- private int curPixel;
- /**
- * GIF Image compression routines
- */
- static final int BITS = 12;
- static final int HSIZE = 5003;
- int n_bits;
- int maxbits = BITS;
- int maxcode;
- int maxmaxcode = 1 << BITS;
- int[] htab = new int[HSIZE];
- int[] codetab = new int[HSIZE];
- int hsize = HSIZE;
- int free_ent = 0;
- boolean clear_flg = false;
- int g_init_bits;
- int ClearCode;
- int EOFCode;
- int cur_accum = 0;
- int cur_bits = 0;
- int masks[] = { 0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F,
- 0x007F, 0x00FF, 0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF,
- 0x7FFF, 0xFFFF };
- int a_count;
- byte[] accum = new byte[256];
- Encoder(int width, int height, byte[] pixels, int color_depth) {
- imgW = width;
- imgH = height;
- pixAry = pixels;
- initCodeSize = Math.max(2, color_depth);
- }
- void char_out(byte c, OutputStream outs) throws IOException {
- accum[a_count++] = c;
- if (a_count >= 254)
- flush_char(outs);
- }
- void cl_block(OutputStream outs) throws IOException {
- cl_hash(hsize);
- free_ent = ClearCode + 2;
- clear_flg = true;
- output(ClearCode, outs);
- }
- void cl_hash(int hsize) {
- for (int i = 0; i < hsize; ++i)
- htab[i] = -1;
- }
- void compress(int init_bits, OutputStream outs) throws IOException {
- int fcode;
- int i ;
- int c;
- int ent;
- int disp;
- int hsize_reg;
- int hshift;
- g_init_bits = init_bits;
- clear_flg = false;
- n_bits = g_init_bits;
- maxcode = MAXCODE(n_bits);
- ClearCode = 1 << (init_bits - 1);
- EOFCode = ClearCode + 1;
- free_ent = ClearCode + 2;
- a_count = 0;
- ent = nextPixel();
- hshift = 0;
- for (fcode = hsize; fcode < 65536; fcode *= 2)
- ++hshift;
- hshift = 8 - hshift;
- hsize_reg = hsize;
- cl_hash(hsize_reg);
- output(ClearCode, outs);
- outer_loop: while ((c = nextPixel()) != EOF) {
- fcode = (c << maxbits) + ent;
- i = (c << hshift) ^ ent;
- if (htab[i] == fcode) {
- ent = codetab[i];
- continue;
- } else if (htab[i] >= 0)
- {
- disp = hsize_reg - i;
- if (i == 0)
- disp = 1;
- do {
- if ((i -= disp) < 0)
- i += hsize_reg;
- if (htab[i] == fcode) {
- ent = codetab[i];
- continue outer_loop;
- }
- } while (htab[i] >= 0);
- }
- output(ent, outs);
- ent = c;
- if (free_ent < maxmaxcode) {
- codetab[i] = free_ent++;
- htab[i] = fcode;
- } else
- cl_block(outs);
- }
- output(ent, outs);
- output(EOFCode, outs);
- }
- void encode(OutputStream os) throws IOException {
- os.write(initCodeSize);
- remaining = imgW * imgH;
- curPixel = 0;
- compress(initCodeSize + 1, os);
- os.write(0);
- }
- void flush_char(OutputStream outs) throws IOException {
- if (a_count > 0) {
- outs.write(a_count);
- outs.write(accum, 0, a_count);
- a_count = 0;
- }
- }
- final int MAXCODE(int n_bits) {
- return (1 << n_bits) - 1;
- }
- private int nextPixel() {
- if (remaining == 0)
- return EOF;
- --remaining;
- byte pix = pixAry[curPixel++];
- return pix & 0xff;
- }
- void output(int code, OutputStream outs) throws IOException {
- cur_accum &= masks[cur_bits];
- if (cur_bits > 0)
- cur_accum |= (code << cur_bits);
- else
- cur_accum = code;
- cur_bits += n_bits;
- while (cur_bits >= 8) {
- char_out((byte) (cur_accum & 0xff), outs);
- cur_accum >>= 8;
- cur_bits -= 8;
- }
- if (free_ent > maxcode || clear_flg) {
- if (clear_flg) {
- maxcode = MAXCODE(n_bits = g_init_bits);
- clear_flg = false;
- } else {
- ++n_bits;
- if (n_bits == maxbits)
- maxcode = maxmaxcode;
- else
- maxcode = MAXCODE(n_bits);
- }
- }
- if (code == EOFCode) {
- while (cur_bits > 0) {
- char_out((byte) (cur_accum & 0xff), outs);
- cur_accum >>= 8;
- cur_bits -= 8;
- }
- flush_char(outs);
- }
- }
- }
0 0
- java生成动态gif格式与png格式的验证码(代码1)
- java生成动态gif格式与png格式的验证码(代码5)
- java生成动态gif格式与png格式的验证码(代码4)
- java生成动态gif格式与png格式的验证码(代码3)
- java生成动态gif格式与png格式的验证码(代码2)
- 无组件生成验证码-GIF格式
- ASP验证码-GIF格式
- ASP实现无组件生成验证码-GIF格式
- 动态生成gif格式的图像要注意?
- js验证上传的文件是否为JPEG,PNG,JPG,GIF格式
- js验证上传的文件是否为JPEG,PNG,JPG,GIF格式
- png格式分析的代码
- ASP生成验证码-BMP图片原理,GIF格式,无组件生成验证码
- 【代码】PHP 生成GIF动画实现动态图片验证码
- GNU/Linux jpg、png、gif 与 eps 格式的相互转换
- Linux下图片 jpg、png、gif 与 eps 格式的相互转换
- Java 转换png jpg gif格式图片的相互转换的实现
- PNG格式图片(验证码..)不能显示的解决办法
- 用两个栈实现队列
- 关于结构体以及内部指针的一道面试题
- linu下编程70条经验总结
- 学习Django(一)
- java线程相关面试题
- java生成动态gif格式与png格式的验证码(代码1)
- 博客现在更新要慢了
- 软件的版本命名管理
- 单例模式
- hihoCoder #1032 : 最长回文子串
- HTML 脚本
- java多线程分块上传并支持断点续传最新修正完整版本
- Java技术笔记2:类与对象实例之用户定义类
- matlab-线性代数 找到一个复数矩阵中具有实部的元素的单索引