Java实现图片验证码功能,存储到io流之中
Posted qiscore
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java实现图片验证码功能,存储到io流之中相关的知识,希望对你有一定的参考价值。
1 package cn.itcast.img; 2 import java.awt.BasicStroke; 3 import java.awt.Color; 4 import java.awt.Font; 5 import java.awt.Graphics2D; 6 import java.awt.Image; 7 import java.awt.image.BufferedImage; 8 import java.io.FileNotFoundException; 9 import java.io.FileOutputStream; 10 import java.io.IOException; 11 import java.io.OutputStream; 12 import java.util.Random; 13 import javax.imageio.ImageIO; 14 public class VerifyCode { 15 private int w=70; 16 private int h=35; 17 private Random r=new Random(); 18 //可选字体 19 private String[] fontNames={"宋体","黑体","楷体_GB2312"}; 20 //可选字符 21 private String codes="23456789abcdefghjkmnopqrstuvwsyzABCDEFGHJKMNPQRSTUVWXYZ"; 22 //背景色 23 private Color bgColor=new Color(255,255,255); 24 //验证码上的文本 25 private String text; 26 //生成随机颜色 27 private Color RandomColor(){ 28 int red=r.nextInt(150); 29 int green=r.nextInt(150); 30 int blue=r.nextInt(150); 31 return new Color(red, green, blue); 32 } 33 //生成随机字体样式 34 private Font RandomFont(){ 35 int index=r.nextInt(fontNames.length); 36 String fontName=fontNames[index]; 37 //生成随机的样式,0为无样式,1为粗体,2为斜体,3为粗体+斜体 38 int style=r.nextInt(4); 39 //生成随机字号24-28 40 int size=r.nextInt(5)+24; 41 return new Font(fontName, style, size); 42 } 43 //创建BufferedImage 44 private BufferedImage createImage(){ 45 BufferedImage image=new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); 46 Graphics2D g2=(Graphics2D)image.getGraphics(); 47 g2.setColor(this.bgColor); 48 g2.fillRect(0, 0, w, h); 49 return image; 50 } 51 //画干扰线 52 private void drawLine(BufferedImage image){ 53 //一共画3条 54 int num=2; 55 Graphics2D g2=(Graphics2D)image.getGraphics(); 56 //生成两个点的坐标,即4个值 57 for (int i = 0; i < num; i++) { 58 int x1=r.nextInt(w); 59 int y1=r.nextInt(h); 60 int x2=r.nextInt(w); 61 int y2=r.nextInt(h); 62 g2.setStroke(new BasicStroke(1.5F)); 63 //干扰线是蓝色 64 g2.setColor(Color.BLUE); 65 g2.drawLine(x1, y1, x2, y2); 66 } 67 } 68 //随机生成一个字符 69 private char randomChar(){ 70 int index=r.nextInt(codes.length()); 71 return codes.charAt(index); 72 } 73 //调用这个方法得到验证码 74 public BufferedImage getImage(){ 75 //创建图片缓冲区 76 BufferedImage image=createImage(); 77 //得到绘制环境 78 Graphics2D g2=(Graphics2D)image.getGraphics(); 79 //装用来载生成的验证码文本 80 StringBuffer sb=new StringBuffer(); 81 //向图片中画4个字符 82 for (int i = 0; i < 4; i++) { 83 //随机生成一个字符 84 String s=randomChar()+""; 85 //把字符添加到sb中 86 sb.append(s); 87 //设置当前字符的x轴坐标 88 float x=i*1.0F*w/4; 89 //设置随机字体 90 g2.setFont(RandomFont()); 91 //设置随机颜色 92 g2.setColor(RandomColor()); 93 //画图 94 g2.drawString(s, x, h-5); 95 } 96 //把生成的字符串赋值给this.test 97 this.text=sb.toString(); 98 //添加干扰线 99 drawLine(image); 100 return image; 101 } 102 //返回验证码图片上的文本 103 public String getText(){ 104 return text; 105 } 106 //保存图片到指定的输出流 107 public static void output (BufferedImage image,OutputStream out) throws IOException{ 108 ImageIO.write(image, "JPEG", out); 109 } 110 }
以上是关于Java实现图片验证码功能,存储到io流之中的主要内容,如果未能解决你的问题,请参考以下文章