java好看的验证码_java 超经漂亮验证码

该代码段展示了一个Java类,用于创建带有干扰线和噪点的随机验证码图片。类中包含了设置图片尺寸、颜色、字体和干扰元素的方法,并能够将生成的验证码图片以PNG格式写入到OutputStream中。此外,还提供了获取验证码字符串和图片Buffer的方法,适用于网页验证场景。
摘要由CSDN通过智能技术生成

1 packagecom.zly.xsp.image;2

3 importjava.awt.Color;4 importjava.awt.Font;5 importjava.awt.Graphics;6 importjava.awt.Graphics2D;7 importjava.awt.image.BufferedImage;8 importjava.io.IOException;9 importjava.io.OutputStream;10 importjava.util.Random;11

12 importjavax.imageio.ImageIO;13 importjavax.servlet.http.HttpServletRequest;14 importjavax.servlet.http.HttpServletResponse;15 importjavax.servlet.http.HttpSession;16

17 public classCreateImageCode {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 = newRandom();31

32 publicCreateImageCode() {33 creatImage();34 }35

36 public CreateImageCode(int width, intheight) {37 this.width =width;38 this.height =height;39 creatImage();40 }41

42 public CreateImageCode(int width, int height, intcodeCount) {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, intlineCount) {50 this.width =width;51 this.height =height;52 this.codeCount =codeCount;53 this.lineCount =lineCount;54 creatImage();55 }56

57 //生成图片

58 private voidcreatImage() {59 int fontWidth = width / codeCount;//字体的宽度

60 int fontHeight = height - 5;//字体的高度

61 int codeY = height - 8;62

63 //图像buffer

64 buffImg = newBufferedImage(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(intn) {115 String str1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";116 String str2 = "";117 int len = str1.length() - 1;118 doubler;119 for (int i = 0; i < n; i++) {120 r = (Math.random()) *len;121 str2 = str2 + str1.charAt((int) r);122 }123 returnstr2;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 newColor(r, g, b);136 }137

138 /**

139 * 产生随机字体140 */

141 private Font getFont(intsize) {142 Random random = newRandom();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, inth1, Color color) {154 shearX(g, w1, h1, color);155 shearY(g, w1, h1, color);156 }157

158 private void shearX(Graphics g, int w1, inth1, 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, inth1, 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) throwsIOException {207 ImageIO.write(buffImg, "png", sos);208 sos.close();209 }210

211 publicBufferedImage getBuffImg() {212 returnbuffImg;213 }214

215 publicString getCode() {216 returncode.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 }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值