Java简单验证码识别(附源码)

学习目的:熟悉java类集与IO流操作,熟悉图像基本知识
可识别的图形:这里写图片描述这里写图片描述这里写图片描述

该验证码下载网址为:http://www.quanjing.com/createImg.aspx
(这个验证码可以采集,在我上一篇http://blog.csdn.net/q651742112/article/details/76177275有源代码)

思路:这个验证码比较规则,数字都是显示在固定的区域,数字也无粘连,实现步骤如下
1.对图像进行分割,分割成一个图像显示一个数字
2
1
2.对每个图像进行灰化处理,就是设置一个阈值将他们变成黑白图片
8
2
3.建立一个标准的数字图像库
0
这里写图片描述
4.将每个被分割的小图片与标准库比较,像素点重合最多的就是该数字

下面是简单界面
8620

识别界面:
界面
结果

截取关键源代码如下(文末有详细的项目下载地址和可打开exe文件):

注意事项:1.标准图像库是对分割的小图片一个一个像素点操作建立的
2.路径不懂的地方可参考我的上一篇文章

package stringText;

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 temp extends JPanel {

    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        System.out.println("请选择你要识别的图片:");//
        temp st = new temp(); // 实例化本类的一个对象
        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]);
        }
    }

    /**
     * 从外部读取文件地址
     * 
     * @return
     */
    public File getFile() {
        JFileChooser fc = new JFileChooser();
        fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
        int returnVal = fc.showOpenDialog(this);
        File fileChoosed = fc.getSelectedFile();
        return fileChoosed;
    }

    /**
     * 将验证码参考的标准图片复制到D:\image\VerificationCode\temp目录下
     * 
     * @throws IOException
     */
    public static void copyStandardImg() throws IOException {
        File sf = new File("d:\\image\\VerificationCode\\temp\\");// 创建保存标准图片的文件夹
        if (!sf.exists()) { // 如果不存在则创建
            sf.mkdirs();
        }
        temp st = new temp(); // 实例化本类的一个对象
        for (int i = 0; i < 10; i++) {
            String s = i + ".gif"; // 设置文件名
            InputStream is = st.getClass().getResourceAsStream("/image/" + s); // 读取包里面的文件流
            // 1K的数据缓冲
            byte[] bs = new byte[1024];
            // 读取到的数据长度
            int len;

            OutputStream os = new FileOutputStream(sf.getPath() + "\\" + s); // 新建输出文件
            while ((len = is.read(bs)) != -1) {
                os.write(bs, 0, len); // 将输出流写到文件
            }
        }

    }

    /**
     * 传入要识别的图片,返回识别的数字
     */
    public static int[] discernImg(String imgPath) {
        int result[] = new int[4]; // 保存结果的数组
        try {
            BufferedImage image; // 用来保存图片

            image = ImageIO.read(new File(imgPath)); // 读取图片
            List<BufferedImage> bufImgList = new ArrayList<BufferedImage>(); // 保存分割的图片
            bufImgList = splitImage(image); // 分割图片
            for (int i = 0; i < 4; i++) {
                bufImgList.set(i, removeBackgroudMin(bufImgList.get(i))); // 对每张图片灰度化
                result[i] = decideImgNumber(bufImgList.get(i)); // 识别每张小图的数字
            }

        } catch (Exception e) {
            // TODO: handle exception
        }
        return result;
    }

    /**
     * 分割图片,并返回图片列表
     * 
     * @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;
    }

    /**
     * 预处理验证码图片,小图片变为黑白
     * 
     * @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;
    }

    /**
     * 保存图片(可指定保存文件路径和文件名)
     * 
     * @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
        }

    }

    /**
     * 预处理验证码图片,小图片变为黑白
     * 
     * @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;
    }

    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
    }

    /**
     * 根据像素点RGB的值来返回像素点各值之和
     */
    public static int getRgbalue(int colorInt) {
        Color color = new Color(colorInt); // 实例化颜色类
        if ((color.getRed() + color.getGreen() + color.getBlue() > 0))
            return 0;// 设置阈值,来判断该像素是否是黑色
        return 1;
    }

    /**
     * 绘制数字像素标准模版,通过对被分割和灰话的图片进行更改(临时函数)
     * 
     * @throws IOException
     */
    public static void drawStandardTemplate(int n) throws IOException {
        int width = 9; // 获取传入图片的宽度
        int height = 12;// 获取传入图片的高度
        BufferedImage standardPicture;

        // BufferedImage standardPicture1 = new BufferedImage(width, height,
        // BufferedImage.TYPE_3BYTE_BGR); // 新建处理后的图片
        // Graphics g = standardPicture1.getGraphics();//
        // 再创建一个Graphics变量,用来画出来要保持的图片,及上面传递过来的Image变量
        // g.drawImage(standardPicture1, 0, 0, null); // 绘制图片到新建的图片

        switch (n) {
        case 0: {
            standardPicture = ImageIO.read(new File("d:\\image\\VerificationCode\\2017年6月27日17时20分第4张.gif"));
            File sf = new File("d:\\image\\VerificationCode\\standard\\0.gif");
            if (!sf.exists()) {
                sf.mkdirs();
            }
            standardPicture.setRGB(5, 0, Color.WHITE.getRGB());
            standardPicture.setRGB(6, 0, Color.WHITE.getRGB());
            standardPicture.setRGB(6, 1, Color.WHITE.getRGB());
            standardPicture.setRGB(0, 2, Color.BLACK.getRGB());
            standardPicture.setRGB(3, 2, Color.WHITE.getRGB());
            standardPicture.setRGB(2, 6, Color.WHITE.getRGB());
            standardPicture.setRGB(3, 8, Color.WHITE.getRGB());
            standardPicture.setRGB(6, 10, Color.WHITE.getRGB());
            standardPicture.setRGB(5, 11, Color.WHITE.getRGB());
            standardPicture.setRGB(8, 11, Color.WHITE.getRGB());
            // for (int x = 0; x < width; ++x) {
            // for (int y = 0; y < height; ++y) {
            //
            // standardPicture.setRGB(x, y, Color.WHITE.getRGB());
            // }
            // }
            ImageIO.write(standardPicture, "gif", new File("d:\\image\\VerificationCode\\standard\\0.gif"));// 将BufferedImage变量写入文件中。
        }

            break;
        case 1: {

            standardPicture = ImageIO.read(new File("d:\\image\\VerificationCode\\2017年6月27日17时20分第3张验证码分割12.gif"));
            File sf = new File("d:\\image\\VerificationCode\\standard\\1.gif");
            if (!sf.exists()) {
                sf.mkdirs();
            }
            standardPicture.setRGB(5, 0, Color.BLACK.getRGB());
            standardPicture.setRGB(2, 1, Color.BLACK.getRGB());
            standardPicture.setRGB(8, 1, Color.WHITE.getRGB());
            standardPicture.setRGB(5, 2, Color.BLACK.getRGB());
            standardPicture.setRGB(8, 2, Color.WHITE.getRGB());
            standardPicture.setRGB(5, 3, Color.BLACK.getRGB());
            standardPicture.setRGB(5, 4, Color.BLACK.getRGB());
            standardPicture.setRGB(3, 5, Color.BLACK.getRGB());
            standardPicture.setRGB(5, 5, Color.BLACK.getRGB());
            standardPicture.setRGB(5, 6, Color.BLACK.getRGB());
            standardPicture.setRGB(3, 7, Color.BLACK.getRGB());
            standardPicture.setRGB(7, 8, Color.WHITE.getRGB());
            standardPicture.setRGB(0, 9, Color.WHITE.getRGB());
            standardPicture.setRGB(3, 9, Color.BLACK.getRGB());
            standardPicture.setRGB(5, 10, Color.BLACK.getRGB());
            standardPicture.setRGB(3, 11, Color.BLACK.getRGB());
            standardPicture.setRGB(5, 11, Color.BLACK.getRGB());
            // for (int x = 0; x < width; ++x) {
            // for (int y = 0; y < height; ++y) {
            //
            // standardPicture.setRGB(x, y, Color.WHITE.getRGB());
            // }
            // }
            ImageIO.write(standardPicture, "gif", new File("d:\\image\\VerificationCode\\standard\\1.gif"));// 将BufferedImage变量写入文件中。
        }

            break;
        case 2: {
            standardPicture = ImageIO.read(new File("d:\\image\\VerificationCode\\2017年6月27日17时20分第3张验证码分割10.gif"));
            File sf = new File("d:\\image\\VerificationCode\\standard\\");
            if (!sf.exists()) {
                sf.mkdirs();
            }
            standardPicture.setRGB(1, 0, Color.WHITE.getRGB());
            standardPicture.setRGB(5, 0, Color.WHITE.getRGB());
            standardPicture.setRGB(6, 0, Color.WHITE.getRGB());
            standardPicture.setRGB(7, 0, Color.WHITE.getRGB());
            standardPicture.setRGB(7, 4, Color.WHITE.getRGB());
            standardPicture.setRGB(2, 5, Color.WHITE.getRGB());
            standardPicture.setRGB(2, 6, Color.WHITE.getRGB());
            standardPicture.setRGB(7, 7, Color.WHITE.getRGB());
            standardPicture.setRGB(7, 8, Color.WHITE.getRGB());
            // for (int x = 0; x < width; ++x) {
            // for (int y = 0; y < height; ++y) {
            //
            // standardPicture.setRGB(x, y, Color.WHITE.getRGB());
            // }
            // }
            ImageIO.write(standardPicture, "gif", new File("d:\\image\\VerificationCode\\standard\\2.gif"));// 将BufferedImage变量写入文件中。
        }

            break;
        case 3: {
            standardPicture = ImageIO.read(new File("d:\\image\\VerificationCode\\2017年6月27日17时20分第3张验证码分割14.gif"));
            File sf = new File("d:\\image\\VerificationCode\\standard\\");
            if (!sf.exists()) {
                sf.mkdirs();
            }
            standardPicture.setRGB(5, 0, Color.WHITE.getRGB());
            standardPicture.setRGB(7, 0, Color.WHITE.getRGB());
            standardPicture.setRGB(6, 0, Color.WHITE.getRGB());
            standardPicture.setRGB(7, 0, Color.WHITE.getRGB());
            standardPicture.setRGB(6, 3, Color.BLACK.getRGB());
            standardPicture.setRGB(1, 5, Color.WHITE.getRGB());
            standardPicture.setRGB(2, 5, Color.WHITE.getRGB());
            standardPicture.setRGB(6, 5, Color.BLACK.getRGB());
            standardPicture.setRGB(1, 6, Color.WHITE.getRGB());
            standardPicture.setRGB(2, 6, Color.WHITE.getRGB());
            standardPicture.setRGB(3, 6, Color.WHITE.getRGB());
            standardPicture.setRGB(7, 7, Color.WHITE.getRGB());
            standardPicture.setRGB(1, 8, Color.WHITE.getRGB());
            standardPicture.setRGB(7, 8, Color.WHITE.getRGB());
            standardPicture.setRGB(2, 9, Color.WHITE.getRGB());
            standardPicture.setRGB(0, 10, Color.WHITE.getRGB());
            standardPicture.setRGB(1, 11, Color.WHITE.getRGB());
            // for (int x = 0; x < width; ++x) {
            // for (int y = 0; y < height; ++y) {
            //
            // standardPicture.setRGB(x, y, Color.WHITE.getRGB());
            // }
            // }
            ImageIO.write(standardPicture, "gif", new File("d:\\image\\VerificationCode\\standard\\3.gif"));// 将BufferedImage变量写入文件中。
        }

            break;
        case 4: {
            standardPicture = ImageIO.read(new File("d:\\image\\VerificationCode\\2017年6月27日17时20分第3张验证码分割15.gif"));
            File sf = new File("d:\\image\\VerificationCode\\standard\\");
            if (!sf.exists()) {
                sf.mkdirs();
            }
            standardPicture.setRGB(3, 0, Color.WHITE.getRGB());
            standardPicture.setRGB(1, 1, Color.WHITE.getRGB());
            standardPicture.setRGB(2, 1, Color.WHITE.getRGB());
            standardPicture.setRGB(3, 1, Color.BLACK.getRGB());
            standardPicture.setRGB(8, 1, Color.WHITE.getRGB());
            standardPicture.setRGB(1, 2, Color.WHITE.getRGB());
            standardPicture.setRGB(2, 2, Color.WHITE.getRGB());
            standardPicture.setRGB(0, 3, Color.WHITE.getRGB());
            standardPicture.setRGB(2, 3, Color.BLACK.getRGB());
            standardPicture.setRGB(7, 3, Color.WHITE.getRGB());
            standardPicture.setRGB(8, 3, Color.WHITE.getRGB());
            standardPicture.setRGB(0, 4, Color.WHITE.getRGB());
            standardPicture.setRGB(4, 4, Color.WHITE.getRGB());
            standardPicture.setRGB(0, 5, Color.BLACK.getRGB());
            standardPicture.setRGB(3, 5, Color.WHITE.getRGB());
            standardPicture.setRGB(0, 9, Color.WHITE.getRGB());
            standardPicture.setRGB(1, 11, Color.WHITE.getRGB());
            // for (int x = 0; x < width; ++x) {
            // for (int y = 0; y < height; ++y) {
            //
            // standardPicture.setRGB(x, y, Color.WHITE.getRGB());
            // }
            // }
            ImageIO.write(standardPicture, "gif", new File("d:\\image\\VerificationCode\\standard\\4.gif"));// 将BufferedImage变量写入文件中。
        }

            break;
        case 5: {
            standardPicture = ImageIO.read(new File("d:\\image\\VerificationCode\\2017年6月27日17时20分第3张验证码分割13.gif"));
            File sf = new File("d:\\image\\VerificationCode\\standard\\");
            if (!sf.exists()) {
                sf.mkdirs();
            }
            standardPicture.setRGB(0, 2, Color.BLACK.getRGB());
            standardPicture.setRGB(0, 3, Color.BLACK.getRGB());
            standardPicture.setRGB(0, 4, Color.BLACK.getRGB());
            standardPicture.setRGB(5, 4, Color.WHITE.getRGB());
            standardPicture.setRGB(6, 5, Color.WHITE.getRGB());
            standardPicture.setRGB(0, 6, Color.WHITE.getRGB());
            standardPicture.setRGB(1, 6, Color.WHITE.getRGB());
            standardPicture.setRGB(0, 5, Color.WHITE.getRGB());
            standardPicture.setRGB(5, 5, Color.BLACK.getRGB());

            standardPicture.setRGB(5, 7, Color.BLACK.getRGB());
            // for (int x = 0; x < width; ++x) {
            // for (int y = 0; y < height; ++y) {
            //
            // standardPicture.setRGB(x, y, Color.WHITE.getRGB());
            // }
            // }
            ImageIO.write(standardPicture, "gif", new File("d:\\image\\VerificationCode\\standard\\5.gif"));// 将BufferedImage变量写入文件中。
        }

            break;
        case 6: {
            standardPicture = ImageIO.read(new File("d:\\image\\VerificationCode\\2017年6月27日17时20分第3张.gif"));
            File sf = new File("d:\\image\\VerificationCode\\standard\\");
            if (!sf.exists()) {
                sf.mkdirs();
            }
            standardPicture.setRGB(8, 1, Color.WHITE.getRGB());
            standardPicture.setRGB(8, 6, Color.WHITE.getRGB());
            standardPicture.setRGB(2, 8, Color.WHITE.getRGB());
            standardPicture.setRGB(7, 9, Color.WHITE.getRGB());
            standardPicture.setRGB(6, 10, Color.WHITE.getRGB());
            standardPicture.setRGB(7, 10, Color.WHITE.getRGB());
            standardPicture.setRGB(8, 10, Color.WHITE.getRGB());
            // for (int x = 0; x < width; ++x) {
            // for (int y = 0; y < height; ++y) {
            //
            // standardPicture.setRGB(x, y, Color.WHITE.getRGB());
            // }
            // }
            ImageIO.write(standardPicture, "gif", new File("d:\\image\\VerificationCode\\standard\\6.gif"));// 将BufferedImage变量写入文件中。
        }

            break;
        case 7: {
            standardPicture = ImageIO.read(new File("d:\\image\\VerificationCode\\2017年6月27日17时20分第3张验证码分割16.gif"));
            File sf = new File("d:\\image\\VerificationCode\\standard\\");
            if (!sf.exists()) {
                sf.mkdirs();
            }
            standardPicture.setRGB(7, 0, Color.WHITE.getRGB());
            standardPicture.setRGB(3, 1, Color.BLACK.getRGB());
            standardPicture.setRGB(8, 4, Color.WHITE.getRGB());
            standardPicture.setRGB(5, 5, Color.WHITE.getRGB());
            standardPicture.setRGB(5, 8, Color.WHITE.getRGB());
            standardPicture.setRGB(6, 8, Color.WHITE.getRGB());
            standardPicture.setRGB(0, 9, Color.WHITE.getRGB());
            standardPicture.setRGB(1, 9, Color.WHITE.getRGB());
            standardPicture.setRGB(5, 9, Color.WHITE.getRGB());
            standardPicture.setRGB(6, 9, Color.WHITE.getRGB());
            // for (int x = 0; x < width; ++x) {
            // for (int y = 0; y < height; ++y) {
            //
            // standardPicture.setRGB(x, y, Color.WHITE.getRGB());
            // }
            // }
            ImageIO.write(standardPicture, "gif", new File("d:\\image\\VerificationCode\\standard\\7.gif"));// 将BufferedImage变量写入文件中。
        }

            break;
        case 8: {
            standardPicture = ImageIO.read(new File("d:\\image\\VerificationCode\\2017年6月27日17时20分第1张.gif"));
            File sf = new File("d:\\image\\VerificationCode\\standard\\8.gif");
            if (!sf.exists()) {
                sf.mkdirs();
            }
            standardPicture.setRGB(0, 1, Color.WHITE.getRGB());
            standardPicture.setRGB(1, 2, Color.BLACK.getRGB());
            standardPicture.setRGB(2, 2, Color.BLACK.getRGB());
            standardPicture.setRGB(4, 2, Color.BLACK.getRGB());
            standardPicture.setRGB(7, 2, Color.WHITE.getRGB());
            standardPicture.setRGB(0, 3, Color.BLACK.getRGB());
            standardPicture.setRGB(4, 3, Color.WHITE.getRGB());
            standardPicture.setRGB(0, 4, Color.BLACK.getRGB());
            standardPicture.setRGB(6, 4, Color.BLACK.getRGB());
            standardPicture.setRGB(0, 5, Color.WHITE.getRGB());
            standardPicture.setRGB(6, 5, Color.WHITE.getRGB());
            standardPicture.setRGB(3, 6, Color.BLACK.getRGB());
            standardPicture.setRGB(3, 7, Color.BLACK.getRGB());
            standardPicture.setRGB(4, 7, Color.BLACK.getRGB());
            standardPicture.setRGB(6, 10, Color.WHITE.getRGB());
            standardPicture.setRGB(6, 11, Color.WHITE.getRGB());
            // for (int x = 0; x < width; ++x) {
            // for (int y = 0; y < height; ++y) {
            //
            // standardPicture.setRGB(x, y, Color.WHITE.getRGB());
            // }
            // }
            ImageIO.write(standardPicture, "gif", new File("d:\\image\\VerificationCode\\standard\\8.gif"));// 将BufferedImage变量写入文件中。
        }

            break;
        case 9: {
            standardPicture = ImageIO.read(new File("d:\\image\\VerificationCode\\2017年6月27日17时20分第3张验证码分割17.gif"));
            File sf = new File("d:\\image\\VerificationCode\\standard\\");
            if (!sf.exists()) {
                sf.mkdirs();
            }
            standardPicture.setRGB(6, 1, Color.WHITE.getRGB());
            standardPicture.setRGB(7, 1, Color.WHITE.getRGB());
            standardPicture.setRGB(7, 2, Color.WHITE.getRGB());
            standardPicture.setRGB(7, 7, Color.WHITE.getRGB());
            standardPicture.setRGB(8, 7, Color.WHITE.getRGB());
            standardPicture.setRGB(0, 10, Color.WHITE.getRGB());
            // for (int x = 0; x < width; ++x) {
            // for (int y = 0; y < height; ++y) {
            //
            // standardPicture.setRGB(x, y, Color.WHITE.getRGB());
            // }
            // }
            ImageIO.write(standardPicture, "gif", new File("d:\\image\\VerificationCode\\standard\\9.gif"));// 将BufferedImage变量写入文件中。
        }

            break;
        default:
            break;
        }
    }

    /**
     * 图片与图片之间的黑色像素比较
     */
    public static int imgToImgCompare(BufferedImage bufImg, BufferedImage standardImg) {
        int width = bufImg.getWidth(); // 读取识别图片的高度与宽度
        int height = bufImg.getHeight();
        int count = 0;
        for (int x = 0; x < width; ++x) { // 循环每一个像素
            for (int y = 0; y < height; ++y) {
                if (bufImg.getRGB(x, y) == standardImg.getRGB(x, y) && bufImg.getRGB(x, y) == Color.BLACK.getRGB()) {// 相等就加一
                    count++;
                }
            }
        }

        return count;
    }

    /**
     * 确认被分割的小图片的数字
     */
    public static int decideImgNumber(BufferedImage bufImg) throws Exception {
        // try {
        // 自己输入的绝对路径
        // 读取标准图片
        BufferedImage standardImg0 = ImageIO.read(new File("D:\\image\\VerificationCode\\temp\\0.gif"));
        BufferedImage standardImg1 = ImageIO.read(new File("D:\\image\\VerificationCode\\temp\\1.gif"));
        BufferedImage standardImg2 = ImageIO.read(new File("D:\\image\\VerificationCode\\temp\\2.gif"));
        BufferedImage standardImg3 = ImageIO.read(new File("D:\\image\\VerificationCode\\temp\\3.gif"));
        BufferedImage standardImg4 = ImageIO.read(new File("D:\\image\\VerificationCode\\temp\\4.gif"));
        BufferedImage standardImg5 = ImageIO.read(new File("D:\\image\\VerificationCode\\temp\\5.gif"));
        BufferedImage standardImg6 = ImageIO.read(new File("D:\\image\\VerificationCode\\temp\\6.gif"));
        BufferedImage standardImg7 = ImageIO.read(new File("D:\\image\\VerificationCode\\temp\\7.gif"));
        BufferedImage standardImg8 = ImageIO.read(new File("D:\\image\\VerificationCode\\temp\\8.gif"));
        BufferedImage standardImg9 = ImageIO.read(new File("D:\\image\\VerificationCode\\temp\\9.gif"));

        int result[] = new int[10]; // 存储与每一个标准图片比较的结果
        // 下面为取出比较结果的最大值
        int max = 0; // 保存最大值
        int site = 0; // 保存识别的数字
        for (int i = 0; i < 10; i++) { // 一一识别
            switch (i) {
            case 0: {
                result[i] = imgToImgCompare(bufImg, standardImg0);
            }

                break;
            case 1: {
                result[i] = imgToImgCompare(bufImg, standardImg1);
            }
                break;
            case 2: {
                result[i] = imgToImgCompare(bufImg, standardImg2);
            }
                break;
            case 3: {
                result[i] = imgToImgCompare(bufImg, standardImg3);
            }
                break;
            case 4: {
                result[i] = imgToImgCompare(bufImg, standardImg4);
            }
                break;
            case 5: {
                result[i] = imgToImgCompare(bufImg, standardImg5);
            }
                break;
            case 6: {
                result[i] = imgToImgCompare(bufImg, standardImg6);
            }
                break;
            case 7: {
                result[i] = imgToImgCompare(bufImg, standardImg7);
            }
                break;
            case 8: {
                result[i] = imgToImgCompare(bufImg, standardImg8);
            }
                break;
            case 9: {
                result[i] = imgToImgCompare(bufImg, standardImg9);
            }
                break;
            default:
                break;
            }

        }

        for (int i = 0; i < 10; i++) { // 比较大小
            if (result[i] > max) {
                max = result[i];
                site = i;
            }
        }
        return site; // 返回识别的数字
        // } catch (Exception e) {
        // // TODO: handle exception
        // System.out.println(e);
        // }
        // return 0;
        // }
    }

}

源代码打包地址:链接:https://download.csdn.net/download/q651742112/10527190

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值