java实现简单的验证码(待增强)
package com.xxx;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.imageio.ImageIO;
import org.junit.Test;
public class IdentifyingCode {
private final int WIDTH = 70;
private final int HEIGHT = 30;
private final byte[] BACKGROUND_COLOR = new byte[]{127, 127, 127};
private final String FONT_STYLE = "微软雅黑";
private final char[] IDETIFYING_CODE = new char[]{'1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd'};
private final int CODE_LENGTH= 4;
private final int FONT_SIZE = 17;
//生成验证码图
public BufferedImage createIdentifyingCode(){
StringBuilder sb = new StringBuilder();
BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_3BYTE_BGR);
//得到画笔
Graphics2D g = image.createGraphics();
//得到之前画笔的颜色
Color color = g.getColor();
//画图片边框
this.drawImageCheek(g);
this.drawCamouflageLine(g, 8);
//设置背景色
g.setBackground(new Color(BACKGROUND_COLOR[0]+128, BACKGROUND_COLOR[1]+128, BACKGROUND_COLOR[2]+128));
//设置字体大小及其样式
g.setFont(new Font(FONT_STYLE, Font.PLAIN, (int)(this.FONT_SIZE)){
private static final long serialVersionUID = 1L;});
//将验证字符加入图中
for(int i=0; i<CODE_LENGTH; i++){
//设置画笔颜色
g.setColor(this.randomColor());
//得到随机字符
char charCode = IDETIFYING_CODE[this.randomNumber(0, IDETIFYING_CODE.length-1)];
sb.append(charCode);
//将字符写到图片中
System.out.println(sb);
//g.rotate(this.randomNumber(45, 135));
g.drawString(""+charCode, WIDTH/5*(i+1)-5, (this.FONT_SIZE)+this.randomNumber(0, this.FONT_SIZE/2));
}
try {
ImageIO.write(image, "jpeg", new FileOutputStream("D:/11.jpeg"));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return image;
}
/**
* 按照随机三原色生成一个颜色
*
* @return 颜色
*/
public Color randomColor(){
int min = 0;
int max = 255;
int red = randomNumber(min, max);
int green = randomNumber(min, max);
int yellow = randomNumber(min, max);
return new Color(red, green, yellow);
}
public void drawCamouflageLine(Graphics2D g, int quantity){
Color oldColor = g.getColor();
for(int i=0; i<quantity; i++){
g.setColor(this.randomColor());
g.drawLine(this.randomNumber(0, this.WIDTH), this.randomNumber(0, this.HEIGHT), this.randomNumber(0, this.WIDTH), this.randomNumber(0, this.HEIGHT));
}
g.setColor(oldColor);
}
/**
* 绘制图片内侧边框
*
* @param g 画笔
*/
public void drawImageCheek(Graphics2D g){
Color oldColor = g.getColor();
g.setColor(new Color(255, 255, 255));
g.drawLine(0, 0, this.WIDTH-2, 0);
g.drawLine(0, 0, 0, this.HEIGHT-2);
g.drawLine(0, this.HEIGHT-2, this.WIDTH-2, this.HEIGHT-2);
g.drawLine(this.WIDTH-2, 0, this.WIDTH-2, this.HEIGHT-2);
g.setColor(oldColor);
}
public int randomNumber(int min, int max){
return (int)((Math.random()*(max-min+1))+min);
}
public static void main(String[] args) {
new IdentifyingCode().createIdentifyingCode();
}
}
其中待解决的问题:背景没有设置正确
待优化:验证图中的验证码需要旋转增加程序识别难度
这是目前的效果
java实现简单的验证码(待增强)的更多相关文章
- java识别简单的验证码
1.老规矩,先上图 要破解类似这样的验证码: 拆分后结果: 然后去匹配,得到结果. 2.拆分图片 拿到图片后,首先把图片中我们需要的部分截取出来. 具体的做法是,创建一个的和图片像素相同的一个代表权重 ...
- java生成简单验证码图片
概要 最近项目需要用java实现输出随机验证码图片到前台,正好有机会接触下java的绘图类,完成需求后也有时间做个总结,写篇随笔记录下也希望能帮助到有同样需求的人! 需求流程图 1.生成随机数 在ja ...
- Java模拟登录带验证码的教务系统(原理详解)
一:原理 客户端访问服务器,服务器通过Session对象记录会话,服务器可以指定一个唯一的session ID作为cookie来代表每个客户端,用来识别这个客户端接下来的请求. 我们通过Chrome浏 ...
- 用java实现邮件发送验证码
java实现邮件发送验证码 建议不要用qq邮箱,我使用qq邮箱直接一直给我报530错误,我一直认为我代码写的有错误或者POP3/SMTP服务没弄好.所以建议注册个别的邮箱,我就申请了个网易163邮箱瞬 ...
- java关于集合的遍历与增强for循环(foreach)的使用
java集合类的使用可以说是无处不在,总的我们可以将之分为三大块,分别是从Collection接口延伸出的List.Set和以键值对形式作存储的Map类型集合. 许多情况需要我们遍历出集合 ...
- Java案例之随机验证码功能实现
实现的功能比较简单,就是随机产生了四个字符然后输出.效果图如下,下面我会详细说一下实现这个功能用到了那些知识点,并且会把 这些知识点详细的介绍出来.哈哈 ,大神勿喷,对于初学Java的人帮助应该蛮大的 ...
- Java使用Java OCR API进行验证码识别
Maven坐标: <!-- https://mvnrepository.com/artifact/com.asprise.ocr/java-ocr-api --> <dependen ...
- 学习笔记:利用GDI+生成简单的验证码图片
学习笔记:利用GDI+生成简单的验证码图片 /// <summary> /// 单击图片时切换图片 /// </summary> /// <param name=&quo ...
- Java实现简单版SVM
Java实现简单版SVM 近期的图像分类工作要用到latent svm,为了更加深入了解svm,自己动手实现一个简单版的. 之所以说是简单版,由于没实用到拉格朗日,对偶,核函数等等.而 ...
随机推荐
- C语言scanf函数详细解释
原文链接 函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准 ...
- FPGA低级建模---按键去抖动
FPGA低级建模,原则上一个模块一个功能,如按键去抖动建模中,有两个模块. 1.detect_module 这个是按键检测模块,主要检测按键的高低电平变化,现在按键是按下还是释放. 2.delay_m ...
- delphi.thread.线程循环执行体结构
线程话题太大,又都是些坑,不知从哪方面讲起,所以,想一出是一出了. 不管怎样,我们从开始使用D,不管有没有用线程,其实它已经帮我们做了一个最完整的线程执行处理:Application.Run. 这行A ...
- 封装tip控件
在界面上有时需要显示一个提示,大多的前端框架都把提示做成一个带有小尖角的提示框,因此自己也仿照了实现了一下,效果图如下: 尖角的实现很简单的,一般都是通过css将div的宽高设置为0,然后将尖角朝向的 ...
- 一个简单的TabItem样式。
分享一个以前项目中用到的简单的TabItem样式. 效果图如下: <SolidColorBrush x:Key="TabItemDisabledBackground" Col ...
- ORACLE插入DATE类型字段
1 怎样在ORACLE中输入DATE类型的字段 insert into table_name (date_column) values(to_date('2006-06-04','yyyy-mm-dd ...
- Json 字符串 转换为 DataTable数据集合
/// <summary> /// 将json转换为DataTable /// </summary> /// <param name="strJson" ...
- VS 设置编译后的程序可以以管理员身份运行
1.首先,创建一个文件命名为 XXX.exe.manifest, 并将以下内容复制到文件 <?xml version="1.0" encoding="UTF-8&q ...
- 2016-11-02: boost::enable_shared_from_this
使用场景 当类对象被shared_ptr管理时,需要在类自己定义的函数中把当前对象作为参数传递给其他函数时,必须传递一个shared_ptr,否则就不能保持shared_ptr管理这个类对象的语义.因 ...
- I/O系统 (输入/输出)
I/O系统 1:流: (1)判断到底是输入,还是输出:永远站在程序的立场上: (2)判断传递的到底是字节还是字符,从而决定管道的粗细: 字节管道可以传递所有数据,字符管道专门用来传递文本数据(1个字符 ...