`

标准图片验证码生成

阅读更多

唉 很辛苦啊 花费了我 一下午的时间 来写图片验证码,总算是小有功效 。

嘿嘿 废话少说,先看效果!



 

嗯 整体感觉 还不错 嘿嘿 。(当然这是其中一张而已,由于背景色都是随机生成的,所有漂亮方面嘿嘿 自己选择咯 要死感觉那种好看 直接就把程序中的颜色写死 好了 嘿嘿 ) 不多少 贴代码 为了 进一步锻炼我的 编码规范 尽量不要出现荣冗余的代码 尽量把代码 写的美观一点 嘿嘿 下面就晒一下我的 代码咯 希望大家 一起讨论进步哈 ,有不对的地方 可以还请指教!谢谢!

 

package com.dk.util;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;

public class ValidateCode {
 /**
 * @see    图片验证码提供类
 * @author 邓葵 QQ:467529125 <E-mail:467529125@qq.com>
 * @param  属性说明:
 * @param  imageBuffer   生成图片对象
 * @param  fontSize      图片码字体大小 初始化参数为:35
 * @param  positionStr1  第一个位置的字符
 * @param  positionStr2  第二个位置的字符
 * @param  positionStr3  第三个位置的字符
 * @param  positionStr4  第四个位置的字符
 * @param  imageStr      图片上的字符
 * @param  imageWidth    图片初始化宽度   初始化宽度为:200
 * @param  imageHeight   图片初始化高度   初始化高度为:50
 * @param  random        产生随机数机器
 * @param  String[] collectStr  所有字符产生集合
 * @param  Graphics2D g  绘图对象
 * @param  fontType      图片码字体类型 初始化参数为:微软雅黑
 * @param  imageFilePath 验证码输出路径
 * @param
 * @param
 * @param  方法说明:
 * @param  Color getColor();           产生一个随机背景色
 * @param  Color reverseColor(Color c) 产生一个随机背景色的反色(即设置为图片字体颜色)
 * @param  methodForGetImageStr()      获得从String字符集合中产生的4个字符
 * @param  methodForDrawImagePic()     使用绘图对象Grahics2D g对象绘制验证码图形
 * @param  methodForOutPutImageToClient() 将图片输出到客户端
 * @param  ValidateCode()              图片验证码生成入口
 * @param
 */

 private BufferedImage imageBuffer = null;    /*生成图片对象*/
 
 private int fontSize = 35;                     /*图片码字体大小 初始化参数为:35*/
     
 private String fontType ="微软雅黑";           /*图片码字体类型 初始化参数为:微软雅黑*/
 
 private String positionStr1;                   /*第一个位置的字符*/
 
 private String positionStr2;                   /*第二个位置的字符*/
 
 private String positionStr3;                   /*第三个位置的字符*/

 private String positionStr4;                /*第四个位置的字符*/
  
 private String imageStr;                       /*图片上的字符*/
 
 private int imageWidth = 200;                  /*图片初始化宽度*/
 
 private int imageHeight = 50;                  /*图片初始化高度*/
 
 private String imageFilePath = "c:validateImage.jpg";             /*验证码输出路径*/
 
 private static Random random = new Random();    /*产生随机数机器*/

 
 
 public static Color getColor() {               /*产生一个随机背景色*/
  return new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)); 
 }

 
 public static Color reverseColor(Color c) {    /*产生一个随机背景色的反色(即设置为图片字体颜色)*/
  return new Color(255 - c.getRed(), 255 - c.getGreen(), 255 - c.getRed());
 }

 
 private String methodForGetImageStr() {         /* 获得从String[] collectStr字符集合中产生的4个字符*/
   //所有字符产生集合
   String[] collectStr  = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j",
    "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",
    "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7",
    "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
    "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V",
    "W", "X", "Y", "Z" };
  //产生每一个字符串位置的随机字符
  positionStr1 = collectStr[random.nextInt(collectStr.length)];
  positionStr2 = collectStr[random.nextInt(collectStr.length)];
  positionStr3 = collectStr[random.nextInt(collectStr.length)];
  positionStr4 = collectStr[random.nextInt(collectStr.length)];
  
  //将以上随机字符组合成图片四个随机字符
  imageStr = positionStr1 + positionStr2 + positionStr3 + positionStr4;
  
  //加上空格显示在以便于显示在图片上看起来不是那么紧凑
  String str = positionStr1 + " " + positionStr2 + " " + positionStr3 + " " + positionStr4;
  
  return str;
 }
 
 
 private void methodForDrawImagePic() {  /*使用绘图对象Grahics2D g对象绘制验证码图形*/
  
  
  //获取绘图对象
  Graphics2D g = imageBuffer.createGraphics();
  
  //绘制干扰线大小为0-3F粗细
  g.setStroke(new BasicStroke((float)(random.nextInt(3))));
  
  //获取背景颜色
  Color color = this.getColor();
  
  //设置背景颜色
  g.setColor(color);
  
  //设置背景颜色从x=0,y=0开始化 背景色区域宽度为:imageWidth 背景色区域高度为:imageHeight
  g.fillRect(0, 0, imageWidth, imageHeight);
  
  //产生10条干扰线条
  for (int i = 0; i < 10; i++) {
   
   //设置干扰线输出的随机颜色
   g.setColor(new Color(random.nextInt(255), random.nextInt(255),random.nextInt(255)));
   //随机输出干扰线在图片的位置
   g.drawLine(random.nextInt(200),random.nextInt(50),random.nextInt(200),random.nextInt(50)); 
   
  }

  //随机产生100个噪音点
  for (int i = 0; i < 100; i++) {
   
   //设置噪音点的大小宽度:0 高度:1 覆盖整个图片区域
   g.drawRect(random.nextInt(imageWidth), random.nextInt(imageHeight), 0, 1);
   
  }

  //设置字体大小,字体类型
  g.setFont(new Font(fontType, Font.BOLD, fontSize));
  
  
  //获取图片上的四个字符
  String str = methodForGetImageStr();
  
  //取得背景色的反色
  Color reverseColor = reverseColor(color);
  
  //设置字体颜色为背景颜色的反色
  g.setColor(reverseColor);
  
  //将文字字符画在图片上
  g.drawString(str, 30, 40);
 }

 
 private void methodForOutPutImageToClient() throws IOException {     /*将图片输出到客户端*/
  
  //生成图片
   methodForDrawImagePic();
     //使用ImageIO对象直接将imageBuffer对象以JPG 的格式传给客户端
  ImageIO.write(imageBuffer, "jpg", new File(imageFilePath));
 }
 
 
 //图片验证码生成入口
 public ValidateCode() {
  try {
   imageBuffer = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_RGB);
   methodForOutPutImageToClient();
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 
 // 返回图片验证码字符
 public String getImageStr() {
  return imageStr;
 }


 public static void main(String args[]) {
  ValidateCode code = new ValidateCode();
  System.out.println("验证码字符:\t"+code.getImageStr());
 }
}

 

  • 大小: 7 KB
分享到:
评论
3 楼 yekui 2012-02-10  
yekui 写道
osacar 写道
基本上是形同虚设啊。这样的验证码。
识别率可以达到100%。



我倒 非要弄个模糊让你看不见 就是牛逼的验证码?将验证码放在图片上显示,这就已经达到了无法让机器人识别的目的。你去看下淘宝,支付宝,中国移动,华为的。。。。。。太难识别的的验证码 体验不好。



再说了,现在验证码,会逐步被动态短信密码 所代替。
2 楼 yekui 2012-02-10  
osacar 写道
基本上是形同虚设啊。这样的验证码。
识别率可以达到100%。



我倒 非要弄个模糊让你看不见 就是牛逼的验证码?将验证码放在图片上显示,这就已经达到了无法让机器人识别的目的。你去看下淘宝,支付宝,中国移动,华为的。。。。。。太难识别的的验证码 体验不好。
1 楼 osacar 2012-02-10  
基本上是形同虚设啊。这样的验证码。
识别率可以达到100%。

相关推荐

    vc++ 根据文字生成图片 文字图片验证码.zip

    "vc++ 根据文字生成图片 文字图片验证码.zip"是一个关于如何使用Visual C++(简称VC++)编程语言来创建文字图片验证码的项目。这个压缩包可能包含必要的源代码、文档和其他资源,帮助开发者了解和实现验证码生成的...

    JSP验证码生成需要的Jar包

    `pmiw`可能是某个第三方库或者项目的简写,它可能提供了验证码生成算法、图片处理等功能。具体的实现细节需要查看该库的文档或源代码才能得知。通常,验证码生成器会包含随机数生成、字符扭曲、颜色填充等组件,以便...

    验证图片生成代码 验证图片生成代码

    2. **图像处理**:验证码的图像通常是非标准的,包含扭曲、噪声或遮挡,以增加机器识别的难度。这需要使用图像处理库,如Python的`PIL`(Pillow)库,它可以创建、打开、显示和修改图像。 3. **字体和颜色**:...

    基于PHP的中文GIF动态验证码生成器的设计与实现 (1).pdf

    3. PHP 语言实现:使用 PHP 语言实现中文 GIF 动态验证码生成器,生成随机的中文 GIF 图片,以提高验证码的安全性。 设计思路: 1. 首先,生成随机数,然后根据随机数生成汉字,使用 GB2312、GBK 和 GB18030 等...

    struts2-生成图片验证码

    此外,每次新的验证码生成时,旧的验证码应从session中清除,防止重复使用。 在提供的文件列表中,我们看到的`.classpath`和`.project`是Eclipse项目设置文件,`WebContent`是Web应用的根目录,`src`是源代码目录,...

    中文验证码(可随机生成任意个数的)

    2. **随机性**:为了增加破解的难度,验证码生成器会从字符库中随机选取一定数量的汉字。这个数量可以由系统设定,例如4个、6个或者更多,根据安全性和用户体验的需求来平衡。 3. **扭曲和混淆**:为了防止机器识别...

    Internet图片验证码系统.rar_vc 验证码_图片验证码_随机_验证码

    在IT领域,尤其是Web开发中,图片验证码扮演着至关重要的角色。本压缩包“Internet图片验证码系统.rar”提供的内容是关于如何使用VC++(Visual C++)开发一个基于图片的随机验证码系统。 首先,我们要理解ASP...

    一些字符图片验证码破解的方法

    字符训练集的标准化涉及到字符图片的大小(如统一为28*28像素)、数据的保存类型等。深度学习模型,如卷积神经网络(CNN),可通过TensorFlow、Theano、Keras等深度学习框架来构造。获取训练数据的batch函数是深度...

    web之动态生成图片-登陆验证码

    动态生成图片验证码的步骤如下: 1. **生成随机字符串**:首先,系统需要生成一个随机的字符串,通常包含数字和字母的组合,长度在4到6位之间。这个字符串就是验证码的内容,用于用户输入验证。 2. **扭曲和变形**...

    图片验证码.zip

    生成图片验证码的过程通常包括以下几个步骤: 1. **随机字符生成**:首先,系统会随机选择一组字符,这可以是字母(大小写)、数字或者特定的符号。字符的数量通常是4到6个,这样既能保证识别的难度,又不至于太过...

    获取验证码c++的程序 含源代码

    在本文中,我们将探讨一个使用C++编程语言实现的验证码生成器,它基于BMP位图进行工作。C++是一种通用的、面向对象的编程语言,因其高效性和灵活性而在系统编程和游戏开发等领域广泛使用。 验证码的生成通常包括...

    机器学习识别图片验证码

    【标题】:“机器学习识别图片验证码” 在当前的网络环境中,图片验证码(CAPTCHA)是一种广泛使用的安全机制,用于防止自动机器人程序进行恶意操作。它要求用户输入图像中显示的一串字符或数字,以证明他们是有...

    图片验证码特殊字体文件

    在图片验证码中,通常会显示一些扭曲的字母或数字,用户需要正确输入才能通过验证。而“图片验证码特殊字体文件”正是这种验证码背后的关键组成部分。 特殊字体文件是验证码设计的核心,因为它们决定了字符的形状、...

    JAVA EasyCode验证码,WEB2.0 图片效果验证码【原创】

    JAVA提供了大量的标准库,如AWT和Swing,用于图形用户界面的构建,可能被用来生成验证码图像。 2. **图像处理**:验证码通常涉及图像处理技术,如像素操作、图像扭曲、滤波等。JAVA中的`java.awt.image`包提供了...

    JSP编程小技巧-已整理 (例:文件上传,图片验证码,JSP标准动作.....)

    这个“JSP编程小技巧”压缩包文件包含了关于JSP开发的一些实用技巧,如文件上传、图片验证码以及JSP标准动作等常见功能的实现。以下是对这些知识点的详细说明: 1. **文件上传**: 文件上传是Web应用中常见的功能...

    PHP生成Gif图片验证码

    【PHP生成Gif图片验证码详解】 验证码是一种常用的安全机制,用于防止自动机器人或恶意脚本进行非法操作。本文将深入探讨如何使用PHP生成Gif格式的动态验证码,其中包括添加噪点、干扰线、网格、随机颜色背景、随机...

    基于python+Django登录网站验证码的生成与识别系统源码数据库.docx

    - **验证码生成**:能够根据用户的请求实时生成验证码,并将生成的验证码图片展示给用户。 - **验证码识别**:提供接口或功能让用户输入验证码,系统自动进行校验,判断输入是否正确。 - **错误处理**:对于输入...

    识别图片数字-验证码

    标题 "识别图片数字-验证码" 暗示了我们探讨的主题是关于图像处理技术,特别是针对验证码的自动识别。验证码(CAPTCHA)是一种用于验证用户是否为人类的技术,通常包含随机生成的一串数字或字母,以图像形式显示。在...

    asp.net利用gdi+生成验证码

    然而,随着技术的发展,更复杂的验证码解决方案(如谷歌的reCAPTCHA)已经成为对抗自动化攻击的标准,它们提供了更高的安全性,同时也考虑到了用户体验。在实际项目中,根据需求和安全性要求,你可能需要考虑使用...

    jsp,Mysql,servlet,验证码为一体的简单的用户登陆验证

    验证码是一种用于验证用户是否为真实人类的机制,通常通过让用户输入图片上显示的一串随机字符来实现。在用户登录过程中,验证码可以防止自动脚本或机器人进行大量的无效登录尝试。在这个项目中,验证码的目的是防止...

Global site tag (gtag.js) - Google Analytics