用javaweb实现图片验证码

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
  
import javax.imageio.ImageIO;
  
  
public class VerifyCode {
   //图片宽高
   private int w= 70 ;
   private int h= 35 ;
   private Random r= new Random();
   private String[] fontNames={ "宋体" , "华文楷体" , "黑体" , "微软雅黑" , "楷体_GB2312" };
   private String codes= "234567890qwertyuipasdfghjkzxcvbnmQWERTYUIPASDFGHJKZXCVBNM" ;
   private Color bgColor= new Color( 255 , 255 , 255 );
   private String text;
   //生成随机颜色
   private Color randomColor(){
     int red=r.nextInt( 150 );
     int green=r.nextInt( 150 );
     int blue=r.nextInt( 150 );
     return new Color(red, green, blue);
     }
   //生成随机字体
   private Font randomFont(){
     int index=r.nextInt(fontNames.length);
     String fontName=fontNames[index];
     int style=r.nextInt( 4 ); //0 无 1 粗体 2 斜体 3 粗+斜
     int size=r.nextInt( 5 )+ 24 ; //生成随机字号 24~28
     return new Font(fontName, style, size);
   }
   //干扰线
   private void drowLine(BufferedImage image){
     //生成4条干扰线
     int num= 4 ;
     Graphics2D bi=(Graphics2D) image.getGraphics();
     for ( int i = 0 ; i < num; i++) {
       int x1=r.nextInt(w);
       int x2=r.nextInt(w);
       int y1=r.nextInt(h);
       int y2=r.nextInt(h);
       bi.setStroke( new BasicStroke( 1 .5F));
       bi.setColor(Color.BLUE); //干扰线色
       bi.drawLine(x1,y1,x2,y2);
     }
   }
   //随机生成一个字符
   private char randomChar(){
     int index=r.nextInt(codes.length());
     return codes.charAt(index);
   }
   //图片缓冲区
   private BufferedImage createImage(){
     BufferedImage image= new BufferedImage(w, h, BufferedImage.TYPE_INT_BGR);
     Graphics2D bi=(Graphics2D) image.getGraphics();
     bi.setColor( this .bgColor);
     bi.fillRect( 0 , 0 , w, h);
     return image;
   }
   //生成图片
   public BufferedImage getImage(){
     BufferedImage image=createImage();
     Graphics2D bi=(Graphics2D) image.getGraphics();
     StringBuilder sb= new StringBuilder();
     for ( int i = 0 ; i < 4 ; i++) {
       String string=randomChar()+ "" ;
       sb.append(string);
       //每个字符占图片1/4宽
       float x=i* 1 .0F*w/ 4 ;
       //随机字体格式
       bi.setFont(randomFont());
       bi.setColor(randomColor());
       //把字写在图片适当处(h-6指图片距底部6个高度)
       bi.drawString(string, x, h- 6 );
     }
     this .text=sb.toString();
     drowLine(image);
     return image;
   }
   //返回得到的字体
   public String getText(){
     return text;
   }
   //把图片写入指定位置
   public static void output(BufferedImage image,OutputStream out){
     try {
       ImageIO.write(image, "JPG" , out);
     } catch (IOException e) {
       e.printStackTrace();
     }
   }
}

转自:http://www.jb51.net/article/100251.htm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值