首页 > 代码库 > java 超经漂亮验证码
java 超经漂亮验证码
1 package com.zly.xsp.image; 2 3 import java.awt.Color; 4 import java.awt.Font; 5 import java.awt.Graphics; 6 import java.awt.Graphics2D; 7 import java.awt.image.BufferedImage; 8 import java.io.IOException; 9 import java.io.OutputStream; 10 import java.util.Random; 11 12 import javax.imageio.ImageIO; 13 import javax.servlet.http.HttpServletRequest; 14 import javax.servlet.http.HttpServletResponse; 15 import javax.servlet.http.HttpSession; 16 17 public class CreateImageCode { 18 // 图片的宽度。 19 private int width = 160; 20 // 图片的高度。 21 private int height = 40; 22 // 验证码字符个数 23 private int codeCount = 4; 24 // 验证码干扰线数 25 private int lineCount = 20; 26 // 验证码 27 private String code = null; 28 // 验证码图片Buffer 29 private BufferedImage buffImg = null; 30 Random random = new Random(); 31 32 public CreateImageCode() { 33 creatImage(); 34 } 35 36 public CreateImageCode(int width, int height) { 37 this.width = width; 38 this.height = height; 39 creatImage(); 40 } 41 42 public CreateImageCode(int width, int height, int codeCount) { 43 this.width = width; 44 this.height = height; 45 this.codeCount = codeCount; 46 creatImage(); 47 } 48 49 public CreateImageCode(int width, int height, int codeCount, int lineCount) { 50 this.width = width; 51 this.height = height; 52 this.codeCount = codeCount; 53 this.lineCount = lineCount; 54 creatImage(); 55 } 56 57 // 生成图片 58 private void creatImage() { 59 int fontWidth = width / codeCount;// 字体的宽度 60 int fontHeight = height - 5;// 字体的高度 61 int codeY = height - 8; 62 63 // 图像buffer 64 buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 65 Graphics g = buffImg.getGraphics(); 66 //Graphics2D g = buffImg.createGraphics(); 67 // 设置背景色 68 g.setColor(getRandColor(200, 250)); 69 g.fillRect(0, 0, width, height); 70 71 72 73 // 设置字体 74 //Font font1 = getFont(fontHeight); 75 Font font = new Font("Fixedsys", Font.BOLD, fontHeight); 76 g.setFont(font); 77 78 // 设置干扰线 79 for (int i = 0; i < lineCount; i++) { 80 int xs = random.nextInt(width); 81 int ys = random.nextInt(height); 82 int xe = xs + random.nextInt(width); 83 int ye = ys + random.nextInt(height); 84 g.setColor(getRandColor(1, 255)); 85 g.drawLine(xs, ys, xe, ye); 86 } 87 88 // 添加噪点 89 float yawpRate = 0.01f;// 噪声率 90 int area = (int) (yawpRate * width * height); 91 for (int i = 0; i < area; i++) { 92 int x = random.nextInt(width); 93 int y = random.nextInt(height); 94 95 buffImg.setRGB(x, y, random.nextInt(255)); 96 } 97 98 99 String str1 = randomStr(codeCount);// 得到随机字符100 this.code = str1;101 for (int i = 0; i < codeCount; i++) {102 String strRand = str1.substring(i, i + 1);103 g.setColor(getRandColor(1, 255));104 // g.drawString(a,x,y);105 // a为要画出来的东西,x和y表示要画的东西最左侧字符的基线位于此图形上下文坐标系的 (x, y) 位置处106 107 g.drawString(strRand, i*fontWidth+3, codeY);108 }109 110 111 }112 113 // 得到随机字符114 private String randomStr(int n) {115 String str1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";116 String str2 = "";117 int len = str1.length() - 1;118 double r;119 for (int i = 0; i < n; i++) {120 r = (Math.random()) * len;121 str2 = str2 + str1.charAt((int) r);122 }123 return str2;124 }125 126 // 得到随机颜色127 private Color getRandColor(int fc, int bc) {// 给定范围获得随机颜色128 if (fc > 255)129 fc = 255;130 if (bc > 255)131 bc = 255;132 int r = fc + random.nextInt(bc - fc);133 int g = fc + random.nextInt(bc - fc);134 int b = fc + random.nextInt(bc - fc);135 return new Color(r, g, b);136 }137 138 /**139 * 产生随机字体140 */141 private Font getFont(int size) {142 Random random = new Random();143 Font font[] = new Font[5];144 font[0] = new Font("Ravie", Font.PLAIN, size);145 font[1] = new Font("Antique Olive Compact", Font.PLAIN, size);146 font[2] = new Font("Fixedsys", Font.PLAIN, size);147 font[3] = new Font("Wide Latin", Font.PLAIN, size);148 font[4] = new Font("Gill Sans Ultra Bold", Font.PLAIN, size);149 return font[random.nextInt(5)];150 }151 152 // 扭曲方法153 private void shear(Graphics g, int w1, int h1, Color color) {154 shearX(g, w1, h1, color);155 shearY(g, w1, h1, color);156 }157 158 private void shearX(Graphics g, int w1, int h1, Color color) {159 160 int period = random.nextInt(2);161 162 boolean borderGap = true;163 int frames = 1;164 int phase = random.nextInt(2);165 166 for (int i = 0; i < h1; i++) {167 double d = (double) (period >> 1)168 * Math.sin((double) i / (double) period169 + (6.2831853071795862D * (double) phase)170 / (double) frames);171 g.copyArea(0, i, w1, 1, (int) d, 0);172 if (borderGap) {173 g.setColor(color);174 g.drawLine((int) d, i, 0, i);175 g.drawLine((int) d + w1, i, w1, i);176 }177 }178 179 }180 181 private void shearY(Graphics g, int w1, int h1, Color color) {182 183 int period = random.nextInt(40) + 10; // 50;184 185 boolean borderGap = true;186 int frames = 20;187 int phase = 7;188 for (int i = 0; i < w1; i++) {189 double d = (double) (period >> 1)190 * Math.sin((double) i / (double) period191 + (6.2831853071795862D * (double) phase)192 / (double) frames);193 g.copyArea(i, 0, 1, h1, 0, (int) d);194 if (borderGap) {195 g.setColor(color);196 g.drawLine(i, (int) d, i, 0);197 g.drawLine(i, (int) d + h1, i, h1);198 }199 200 }201 202 }203 204 205 206 public void write(OutputStream sos) throws IOException {207 ImageIO.write(buffImg, "png", sos);208 sos.close();209 }210 211 public BufferedImage getBuffImg() {212 return buffImg;213 }214 215 public String getCode() {216 return code.toLowerCase();217 }218 219 //使用方法220 /*public void getCode3(HttpServletRequest req, HttpServletResponse response,HttpSession session) throws IOException{221 // 设置响应的类型格式为图片格式222 response.setContentType("image/jpeg");223 //禁止图像缓存。224 response.setHeader("Pragma", "no-cache");225 response.setHeader("Cache-Control", "no-cache");226 response.setDateHeader("Expires", 0);227 228 229 CreateImageCode vCode = new CreateImageCode(100,30,5,10);230 session.setAttribute("code", vCode.getCode());231 vCode.write(response.getOutputStream());232 }*/233 234 }
java 超经漂亮验证码
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。