package com.securityRecognition;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.color.ColorSpace;
import java.awt.image.BufferedImage;
import java.awt.image.ColorConvertOp;
import java.awt.image.ImageObserver;
import java.awt.image.ImageProducer;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.imageio.ImageIO;
import javax.imageio.stream.FileImageInputStream;
import javax.print.attribute.standard.RequestingUserName;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class StartEntrance extends JPanel {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
System.out.println("请选择你要识别的图片:");//
StartEntrance st = new StartEntrance(); // 实例化本类的一个对象
File file = st.getFile(); // 调用函数来获取要识别文件的路径
String path = file.getAbsolutePath(); // 获取要识别文件的绝对路径
BufferedImage image; // 存储要识别的图片
int result[] = new int[4];// 存储识别的结果
copyStandardImg();// 将参考的标准图片复制到D:\image\VerificationCode\temp
result = discernImg(path); // 识别图片,返回数字给数组
System.out.print("识别的结果为:");
for (int i = 0; i < 4; i++) { // 输出结果
System.out.print(result[i]);
}
//下面内容为临时草稿
// System.out.println(imgToImgCompare(image1, standardImage));
// image = image.getSubimage(7, 5, 36, 12);
// image =
// removeBackgroud("d:\\image\\VerificationCode\\2017年6月27日17时20分第1张验证码.gif");
// saveImageWithDispose(image,"d:\\image\\VerificationCode\\","2017年6月27日17时20分第1张验证码copy1.png");//测试该函数
// {// 截取图片
// List<BufferedImage> bufImgList = new ArrayList<BufferedImage>();
// bufImgList = splitImage(image); // 分割图片
// for (int i = 0; i < 4; i++) {
// saveImage(bufImgList.get(i), "d:\\image\\VerificationCode\\",
// "2017年6月27日17时20分第7张验证码" + i + ".gif");
// }
// }
// {//将小图片黑白化
// image=removeBackgroudMin("d:\\image\\VerificationCode\\2017年6月27日17时20分第7张验证码3.gif");
// saveImageWithDispose(image, "d:\\image\\VerificationCode\\",
// "2017年6月27日17时20分第3张验证码分割17.gif");
// }
// outImgPelMatrix(bufImgList.get(0));//输出一个像素矩阵
// drawStandardTemplate(9);// 绘制标准对比图片
// saveImage(image, "d:\\image\\VerificationCode\\",
// "2017年6月27日17时20分第1张验证码copy12.png");//保存图片
}
/**
* 保存图片(可指定保存文件路径和文件名)
*
* @param bufImg
* @param savePath
* @param saveName
*/
public static void saveImage(BufferedImage bufImg, String savePath, String saveName) {
try {
int width = bufImg.getWidth(); // 获取传入图片的宽度
int height = bufImg.getHeight();// 获取传入图片的高度
Graphics g = bufImg.getGraphics();// 再创建一个Graphics变量,用来画出来要保持的图片,及上面传递过来的Image变量
g.drawImage(bufImg, 0, 0, null); // 绘制图片到新建的图片
ImageIO.write(bufImg, "gif", new File(savePath + saveName));// 将BufferedImage变量写入文件中。
} catch (Exception e) {
// TODO: handle exception
}
}
/**
* 将图片变为黑白色并存储图片
*/
public static void saveImageWithDispose(BufferedImage bufImg, String savePath, String saveName) {
try {
int width = bufImg.getWidth(); // 获取传入图片的宽度
int height = bufImg.getHeight();// 获取传入图片的高度
BufferedImage grayPicture = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR); // 新建处理后的图片
ColorConvertOp cco = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null); // 实例化一个ColorConvertOp对象
cco.filter(bufImg, grayPicture); // 将原始图片转化为灰色图片
Graphics g = grayPicture.getGraphics();// 再创建一个Graphics变量,用来画出来要保持的图片,及上面传递过来的Image变量
g.drawImage(grayPicture, 0, 0, null); // 绘制图片到新建的图片
ImageIO.write(grayPicture, "png", new File(savePath + saveName));// 将BufferedImage变量写入文件中。
} catch (Exception e) {
// TODO: handle exception
}
}
/**
* 预处理验证码图片,全部变为黑白
*
* @param picFile
* @return
* @throws Exception
*/
public static BufferedImage removeBackgroud(String picFile) throws Exception {
BufferedImage img = ImageIO.read(new File(picFile));
img = img.getSubimage(7, 5, 36, 12);//取子图片
int width = img.getWidth();
int height = img.getHeight();
for (int x = 0; x < width; ++x) {
for (int y = 0; y < height; ++y) {
if (isWhite(img.getRGB(x, y)) == 1) {
img.setRGB(x, y, Color.WHITE.getRGB());
} else {
img.setRGB(x, y, Color.BLACK.getRGB());
}
}
}
return img;
}
/**
* 预处理验证码图片,小图片变为黑白
*
* @param picFile
* @return
* @throws Exception
*/
public static BufferedImage removeBackgroudMin(String picFile) throws Exception {
BufferedImage img = ImageIO.read(new File(picFile));
int width = img.getWidth();
int height = img.getHeight();
for (int x = 0; x < height; ++x) {
for (int y = 0; y < width; ++y) {
if (isWhite(img.getRGB(y, x)) == 1) {
img.setRGB(y, x, Color.WHITE.getRGB());
} else {
img.setRGB(y, x, Color.BLACK.getRGB());
}
}
}
return img;
}
/**
* 预处理验证码图片,小图片变为黑白
*
* @param picFile
* @return
* @throws Exception
*/
public static BufferedImage removeBackgroudMin(BufferedImage img) throws Exception {
int width = img.getWidth(); //获取图片的高度与宽度
int height = img.getHeight();
for (int x = 0; x < height; ++x) {
for (int y = 0; y < width; ++y) {
if (isWhite(img.getRGB(y, x)) == 1) { //判断该设为白色则设为白色
img.setRGB(y, x, Color.WHITE.getRGB()); //设为白色
} else {
img.setRGB(y, x, Color.BLACK.getRGB()); //设为黑色
}
}
}
return img;
}
public static int isBlack(int colorInt) {
Color color = new Color(colorInt); // 实例化颜色类
if (color.getRed() + color.getGreen() + color.getBlue() <= 100) {// 设置阈值,来判断该像素是否是黑色
return 1; // 是白色则返回1
}
return 0;// 不是白色,则返回0
}
/**
* 判断当前像素点的颜色是否是白色
*
* @param colorInt
* @return
*/
public static int isWhite(int colorInt) {
Color color = new Color(colorInt); // 实例化颜色类
if (color.getRed() + color.getGreen() + color.getBlue() > 450) {// 设置阈值,来判断该像素是否是黑色
return 1; // 是白色则返回1
}
return 0; // 不是白色则返回0
}
/**
* 分割图片,并返回图片列表
*
* @param img
* @return
* @throws Exception
*/
public static List<BufferedImage> splitImage(BufferedImage img) throws Exception {
List<BufferedImage> subImgs = new ArrayList<BufferedImage>();
subImgs.add(img.getSubimage(7, 5, 9, 12));// 截取的起始坐标,图片大小为9x12,起始坐标为(7,5)
subImgs.add(img.getSubimage(16, 5, 9, 12));
subImgs.add(img.getSubimage(25, 5, 9, 12));
subImgs.add(img.getSubimage(34, 5, 9, 12));
return subImgs;
}
/**
* 绘制标准图像库
*/
public static void drawStandard() {
}
/**
* 输出一张图片的像素矩阵,临时函数
*/
public static void outImgPelMatrix(BufferedImage img) {
int width = img.getWidth();
int height = img.getHeight();
System.out.println("宽度为:" + width);
System.out.println("高度为:" + height);
for (int i = 0; i < height; i++) {
System.out.println();
System.out.println();
System.out.println();
System.out.println();
for (int j = 0; j