我们来设计一个简单的验证码生成程序:验证码一个由4位的数字、字母随机组合而成图像,为了避免被光学字元识别(OCR,Optical Character Recognition)之类的程序识别出图片中的数字而失去效果,我们给图像中添加上几条干扰线。

  1. package password;
  2. /**
  3. * 使用Java设计验证码生成程序
  4. * @author hellokitty燕
  5. */
  6. import java.awt.Color;
  7. import java.awt.Font;
  8. import java.awt.Graphics;
  9. import java.awt.Graphics2D;
  10. import java.awt.image.BufferedImage;
  11. import java.util.Random;
  12.  
  13. import javax.swing.ImageIcon;
  14. import javax.swing.JFrame;
  15. import javax.swing.JLabel;
  16.  
  17. public class Verification {
  18.  
  19. /*验证码的框*/
  20. // 图像长度
  21. private int width = 100;
  22. // 图像宽度
  23. private int height = 40;
  24. // 验证码的长度
  25. private int number = 4;
  26. // 验证码随机生成的
  27. private String password = "abcdefghijkmnpqrstuvwxyABCDEFGHIJKLMNPQRSTUVWXYZ23456789";
  28.  
  29. /**
  30. * 获取验证码图像
  31. *
  32. * @return 验证码图像
  33. */
  34. public BufferedImage getImage() {
  35. /*BufferedImage 子类描述具有可访问图像数据缓冲区的 Image。
  36. * BufferedImage(int width, int height, int imageType)构造一个类型为预定义图像类型之一的 BufferedImage。
  37. *
  38. * */
  39. // 创建图像缓冲区
  40. BufferedImage image = new BufferedImage(width, height,
  41. BufferedImage.TYPE_INT_RGB);
  42. // 获取画笔
  43. /*public Graphics getGraphics()*/
  44. Graphics g = image.getGraphics();
  45.  
  46. // 设置图像背景色,填充背景矩形
  47. /*public abstract void setColor(Color c)*/
  48.  
  49. g.setColor(getRandomColor(200, 255));//???
  50. /*public abstract void fillRect(int x,int y,int width,int height)*/
  51. g.fillRect(0, 0, width, height);
  52.  
  53. // 画边框
  54. g.setColor(Color.blue);
  55. g.drawRect(0, 0, width - 1, height - 1);
  56.  
  57. /* 生成随机验证码 */
  58. int len = password.length();
  59. // 设置验证码字体 Font(String name, int style, int size)
  60. // HANGING_BASELINE 布置文本时,在 Devanigiri 和类似脚本中使用的基线。
  61. g.setFont(new Font("楷体", Font.HANGING_BASELINE, 20));
  62.  
  63. // 循环生成验证码各字符????
  64. Random random = new Random();
  65. for (int i = 0; i < number; i++) {
  66. // 随机生成验证码中单个字符/*public int nextInt(int n)返回一个伪随机数,它是取自此随机数生成器序列的、在 0(包括)和指定值(不包括)之间均匀分布的 int 值*/
  67. String randStr = String.valueOf(password.charAt(random.nextInt(len)));
  68. // 单个字符绘制宽度
  69. int width = this.width / this.number;
  70. // 当前字符绘制原点 ????
  71. int x = width * i;
  72. int y = this.height / 2 + random.nextInt(this.height / 3);
  73. /* 将该字符画到图像中 */// ???
  74. drawString(g, x, y, randStr);
  75.  
  76. }
  77.  
  78. // 画干扰线
  79. drawLine(g, 10);
  80.  
  81. // 释放画笔
  82. g.dispose();
  83. return image;
  84.  
  85. }
  86.  
  87. /**
  88. * 画验证码字符串单个字符
  89. *
  90. * @param g
  91. * 图像上下文
  92. * @param x
  93. * 字符 所占宽度
  94. * @param y
  95. * 字符所占高度
  96. * @param randStr
  97. * 待绘制字符串
  98. *
  99. */
  100. private void drawString(Graphics g,int width,int height,String randStr){
  101. //private void drawString(Graphics g, int x, int y, String randStr) {
  102. Random rand = new Random();
  103. // 随机生成字符旋转(-30-30度)/*/*public int nextInt(int n)返回一个伪随机数,它是取自此随机数生成器序列的、在 0(包括)和指定值(不包括)之间均匀分布的 int 值*/*/
  104. int degree = rand.nextInt(60);
  105. if (degree > 30) {
  106. degree = 30 - degree;
  107. }
  108. // 设置字体颜色
  109. g.setColor(getRandomColor(0, 50));
  110. // 转换Graphics2D
  111. Graphics2D g2 = (Graphics2D) g.create();
  112. // 平移原点到图形环境的中心,这个方法的作用实际上就是将字符串移到某一位置/*public abstract void translate(int x,int y)将 Graphics2D 上下文的原点平移到当前坐标系中的点 (x, y)。*/
  113. g2.translate(width + rand.nextInt(5), height + rand.nextInt(5));
  114. // 旋转文本 ( 单位是弧度)
  115. g2.rotate(degree * Math.PI / 180);
  116. // 画文本,特别需要注意的是,这里的笔画已经具有上次指定的一个位置,所以这里指定的位置是一个相对的位置
  117. g2.drawString(randStr, 0, 0);
  118. }
  119.  
  120. /**
  121. *
  122. * 画 随机干扰线
  123. *
  124. * @param g
  125. * 图形上下文(画笔)
  126. *
  127. * @param count
  128. * 干扰线条数
  129. */
  130. private void drawLine(Graphics g,int count){
  131.  
  132. Random random = new Random();
  133. // 循环绘制每条干扰线
  134. for (int j = 0; j < count; j++) {
  135. // 设置线条随机颜色
  136. g.setColor(getRandomColor(180, 200));
  137.  
  138. // 生成随机线条起点终点,坐标点
  139. int x1 = random.nextInt(this.width);
  140. int y1 = random.nextInt(this.height);
  141. int x2 = random.nextInt(this.width);
  142. int y2 = random.nextInt(this.height);
  143. // 画线条
  144. g.drawLine(x1, y1, x2, y2);
  145. }
  146. }
  147.  
  148. /**
  149. * 获取随机颜色
  150. *
  151. * @param i
  152. * 颜色下限值
  153. * @param j
  154. * 颜色上限值
  155. * @return 随机颜色对象
  156. */
  157. private Color getRandomColor(int i, int j) {
  158. if (i > j) {
  159. int tmp = i;
  160. i = j;
  161. j = tmp;
  162. }
  163. if (j > 225) {
  164. j = 225;
  165. }
  166. if (i < 0) {
  167. i = 0;
  168. }
  169. int r = i + (int) (Math.random() * (j - i));
  170. int g = i + (int) (Math.random() * (j - i));
  171. int b = i + (int) (Math.random() * (j - i));
  172.  
  173. return new Color(r, g, b);
  174.  
  175. // values in the range (0 - 255). red green blue
  176. }
  177.  
  178. public static void main(String[] args) {
  179.  
  180. JFrame frame = new JFrame("验证码");
  181. frame.setSize(200, 200);
  182. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  183. frame.setLocationRelativeTo(null);
  184. Verification cation = new Verification();
  185.  
  186. JLabel lbl = new JLabel(new ImageIcon(cation.getImage()));
  187. frame.add(lbl);
  188. frame.setVisible(true);
  189.  
  190. }
  191.  
  192. }

             

使用Java设计验证码生成程序的更多相关文章

  1. java简单验证码生成程序

    下面的函数,返回的字符串就是所需验证码 public String id(){ Random ra =new Random(); st=""; String [] w= {&quo ...

  2. 工作笔记5.JAVA图片验证码

    本文主要内容为:利用JAVA图片制作验证码. 设计思路: 1.拷贝AuthImageServlet.class图片验证码 2.配置web.xml 3.JSP中,调用封装好的AuthImageServl ...

  3. java识别验证码

    所需资源下载链接(资源免费,重在分享) Tesseract:http://download.csdn.net/detail/chenyangqi/9190667 jai_imageio-1.1-alp ...

  4. 【开发技术】Java生成验证码

    Java生成验证码 为了防止用户恶意,或者使用软件外挂提交一些内容,就得用验证码来阻止,虽然这个会影响用户体验,但为了避免一些问题很多网站都使用了验证码;今天下午参考文档弄了一个验证码,这里分享一下; ...

  5. java制作验证码(java验证码小程序)

    手动制作java的验证码 Web应用验证码的组成: (1)输入框 (2)显示验证码的图片 验证码的制作流程: 生成验证码的容器使用 j2ee的servlet 生成图片需要的类: (1) Buffere ...

  6. Swing 是一个为Java设计的GUI工具包

    Swing 是一个为Java设计的GUI工具包. Swing是JAVA基础类的一部分. Swing包括了图形用户界面(GUI)器件如:文本框,按钮,分隔窗格和表. Swing提供许多比AWT更好的屏幕 ...

  7. java图形验证码

    用java实现验证码的生成,以下代码是一个controller,可以直接使用 package org.jxnd.tongxuelu.controller; import java.awt.Color; ...

  8. java实现验证码功能

    java实现验证码功能 通过java代码实现验证码功能的一般思路: 一.通过java代码生成一张验证码的图片,将验证码的图片保存到项目中的指定文件中去,代码如下: package com.util; ...

  9. java生成图片验证码(转)--封装生成图片验证码的工具类

    博客部分内容转载自 LonlySnow的博客:后台java 实现验证码生成 1.controller方法 @RequestMapping(value = "/verifycode/img&q ...

随机推荐

  1. jquery ui widgets-datepicker

    jquery ui的用法就不在此讲述,直接进入jquery ui的窗体小部件(widgets)——datepicker. 相信很多像我这样子的菜鸟少年,如果同一个页面上有两个input文本输入框是用来 ...

  2. Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad

    Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad 方法一:安装单独组件 ...

  3. 打开SQL2008R2配置工具,提示远程调用失败[0x800706be]

    卸载了Microsoft SQL Server 2012 Express LocalDB,依然不行. 再卸载Microsoft SQL Server 2014 LocalDB,此时右边显示框已可以显示 ...

  4. linq to sql 查找所有开票金额大于回款金额的项目

    查找所有开票金额大于回款金额的项目 TB_Projects 项目表 TB_Recipts 发票表 TB_Finances 回款表 TB_Projects  一对多 TB_Recipts TB_Proj ...

  5. POST与GET请求的区别

    https://www.cnblogs.com/logsharing/p/8448446.html 返回主页 在途中# 博客园首页新随笔联系订阅管理 随笔 - 33 文章 - 5 评论 - 40 GE ...

  6. Restframework 分页器 Pagnation 组件实例-5

    分页逻辑 from rest_framework.pagination import PageNumberPagination class BookView(APIView): # authentic ...

  7. Android------------------ListVIew学习

    一.ListActivity :  如何你的Activity仅涉及到一个列表(ListVIew),那么你就该考虑使用ListActivity这个类 注意事项:1.ListActivity 里面默认包含 ...

  8. leetcode 121. 买卖股票的最佳时机 JAVA

    题目: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润. 注意你不能在买入股票前卖出股票 ...

  9. Servlet实现session读写

    前言     一个女人让他的程序员丈夫去商店买东西:你去附近的商店买些面包,如果有鸡蛋的话,买6个回来,这个丈夫买了6个面包回来,他的妻子大吃一惊:你为什么买了6个面包?! 程序员丈夫回答:因为他们有 ...

  10. CRUD组件的高阶使用

    1.list页面自定列显示: class PermissionConfig(sites.AryaConfig):       def dabo(self, obj=None, is_header=Fa ...