`

JAVA图片验证码

阅读更多



    import java.awt.Color; 
    import java.awt.Font; 
    import java.awt.Graphics2D; 
    import java.awt.RenderingHints; 
    import java.awt.image.BufferedImage; 
    import java.util.Random; 
     
    import org.apache.commons.lang3.StringUtils; 
     
    /**
     * 图片验证码类
     */ 
    public class Captcha { 
        private int width = 100; 
        private int height = 30; 
        private Random random = new Random(); 
        private BufferedImage image; 
        /** 验证码图片上显示的字符 */ 
        private String code; 
        /** 波形的幅度倍数,越大扭曲的程序越高,一般为3 */ 
        private int twistLevel = 2; 
        /** 干扰线数量 */ 
        private int noiseLineNumber = 3; 
        /** 背景色 */ 
        private Color backgroundColor = Color.WHITE; 
        /** 字体颜色 */ 
        // private Color foregroundColor = Color.BLACK; 
        private Color[] colors = { Color.BLUE, Color.RED, Color.GREEN, Color.BLACK, Color.CYAN, Color.MAGENTA }; 
     
        private Color getRandomColor() { 
            return colors[random.nextInt(colors.length)]; 
        } 
     
        /**
         * @param width
         *            - 验证码图片宽度
         * @param height
         *            - 验证码图片高度
         * @param randomStr
         *            - 随机字符串
         * @return
         */ 
        public Captcha generate(int width, int height, String randomStr) { 
            this.width = width; 
            this.height = height; 
            this.code = randomStr; 
            if (StringUtils.isBlank(code)) { 
                throw new RuntimeException("randomStr can not be empty."); 
            } 
            int xWidth = width / (code.length() + 2); 
            int yIndex = height - 4; 
            Graphics2D graphics = graphicsInit(); 
            for (int i = 0; i < code.length(); i++) { 
                // graphics.setColor(foregroundColor); 
                graphics.setColor(getRandomColor()); 
                graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
                graphics.drawString(code.charAt(i) + "", (i + 1) * xWidth, yIndex); 
            } 
            setBuffImg(disturb()); 
            return this; 
        } 
     
        private Graphics2D graphicsInit() { 
            Graphics2D graphics = buffImgInit().createGraphics(); 
            graphics.setColor(backgroundColor); 
            graphics.fillRect(0, 0, width, height); 
            graphics.setFont(new Font("Fixedsys", Font.ITALIC, height - 2)); 
            graphics.drawRect(0, 0, width - 1, height - 1); 
            return graphics; 
        } 
     
        private BufferedImage buffImgInit() { 
            image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 
            return image; 
        } 
     
        private BufferedImage disturb() { 
            drawNoiseLine(image.createGraphics()); 
            return twistImage(); 
        } 
     
        private void drawNoiseLine(Graphics2D graphics) { 
            int x = 0; 
            int y = 0; 
            int xl = 0; 
            int yl = 0; 
            for (int i = 0; i < noiseLineNumber; i++) { 
                x = random.nextInt(width * 2 / 3); 
                y = random.nextInt(height * 2 / 3); 
                xl = random.nextInt(width / 2); 
                yl = random.nextInt(height / 2); 
                // graphics.setColor(foregroundColor); 
                graphics.setColor(getRandomColor()); 
                graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
                graphics.drawLine(x, y, x + xl, y + yl); 
            } 
        } 
     
        private BufferedImage twistImage() { 
            double dMultValue = random.nextInt(9) + twistLevel; 
            double dPhase = random.nextInt(6);// 波形的起始相位,取值区间(0-2*PI) 
            BufferedImage destBi = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB); 
            Graphics2D graphics = destBi.createGraphics(); 
            graphics.setColor(backgroundColor); 
            graphics.fillRect(0, 0, width, height); 
            for (int i = 0; i < destBi.getWidth(); i++) { 
                for (int j = 0; j < destBi.getHeight(); j++) { 
                    int nOldX = getXPosition4Twist(dPhase, dMultValue, destBi.getHeight(), i, j); 
                    int nOldY = j; 
                    if (nOldX >= 0 && nOldX < destBi.getWidth() && nOldY >= 0 && nOldY < destBi.getHeight()) { 
                        destBi.setRGB(nOldX, nOldY, image.getRGB(i, j)); 
                    } 
                } 
            } 
            return destBi; 
        } 
     
        private int getXPosition4Twist(double dPhase, double dMultValue, int height, int xPosition, int yPosition) { 
            double PI = Math.PI; // 此值越大,扭曲程度越大 
            double dx = (double) (PI * yPosition) / height + dPhase; 
            double dy = Math.sin(dx); 
            return xPosition + (int) (dy * dMultValue); 
        } 
     
        public BufferedImage getImage() { 
            return image; 
        } 
     
        public void setBuffImg(BufferedImage buffImg) { 
            this.image = buffImg; 
        } 
     
        public int getWidth() { 
            return width; 
        } 
     
        public void setWidth(int width) { 
            this.width = width; 
        } 
     
        public int getHeight() { 
            return height; 
        } 
     
        public void setHeight(int height) { 
            this.height = height; 
        } 
     
    } 



使用示例:
Java代码  收藏代码

    String randomStr = RandomStringUtils.randomAlphabetic(4).toLowerCase(); 
    request.getSession().setAttribute(KEY_CAPTCHA, randomStr); 
    BufferedImage bi = new Captcha().generate(200, 50, randomStr).getImage(); 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bos); 
    encoder.encode(bi); 
    ImageIO.write(bi, "JPEG", response.getOutputStream()); 
分享到:
评论

相关推荐

    Java图片验证码工具类

    Java图片验证码工具类是一种在Web应用中用于防止恶意自动化操作(如机器人)的常用安全机制。它通过生成随机的字符序列并将其显示为图片来工作,用户需要输入看到的字符才能完成验证。以下是对这个Java工具类的详细...

    JAVA图片验证码 图片验证码

    JAVA图片验证码 图片验证码JAVA图片验证码 图片验证码JAVA图片验证码 图片验证码JAVA图片验证码 图片验证码JAVA图片验证码 图片验证码JAVA图片验证码 图片验证码

    java图片验证码

    ### Java 图片验证码实现原理与代码解析 #### 一、概述 在许多网站或应用程序中,为了防止机器人的恶意操作,经常会使用到图形验证码。Java 图片验证码是一种常见的实现方式,它通过生成具有一定随机性的图像,并...

    java图片验证码源码

    验证码(Vercode)是网络应用中常用的一种...总的来说,创建Java图片验证码涉及多个技术点,包括字符串生成、图像处理、随机数生成等。通过理解并实践这些技术,开发者可以创建出适合自己应用的高效安全的验证码系统。

    java-图片验证码.zip

    这个"java-图片验证码.zip"压缩包包含了一个实现Java图片验证码功能的工具类(VerifyUtil.java)和一个具体的控制器(AppPicCodeController.java),用于处理验证码的生成与验证。 首先,我们来详细了解一下`...

    Java图片验证码生成工具类

    好看的图片验证码,包含干扰线、噪点、扭曲图片等。。

    java解析图片验证码

    java解析图片验证码

    java图片验证码 选择 VerificationImage

    java图片验证码 选择 VerificationImage 基本上修改过后能够满足大部分的需求,其中注释也比较详尽,方便阅读和修改

    java 图片验证码

    Java 图片验证码是一种常见的安全措施,用于防止自动化脚本或机器人进行恶意操作,如批量注册、恶意登录等。在Web开发中,Java 提供了多种实现图片验证码的方式。本教程将详细讲解如何在Java Web项目中创建并使用...

    java-验证码识别-验证码破解

    在这个“java-验证码识别-验证码破解”的主题中,我们将深入探讨如何使用Java进行验证码识别,特别是通过Tess4J库进行OCR(光学字符识别)。 验证码的主要目的是防止自动化的恶意行为,如机器人攻击或垃圾邮件发送...

    java生成图片的验证码工具类及其使用

    java生成验证码的工具类,这个现在有依赖可以直接引入调用,但这个工具类没有引入依赖,大家也容易看懂代码,理解其含义。也可直接去工具类中调整生成验证码的宽度、高度、颜色、背景颜色、生成的随机数数量、干扰线...

    Java生成图片验证码工具类源码

    源码提供了一个生成图片验证码的工具类,适用于各种需要验证码的场景,如用户注册、登录等。该工具类使用随机字符生成验证码,并支持自定义验证码长度和字体样式。生成的验证码图片背景透明,线条清晰,可轻松辨认。...

    java识别图片验证码的2种方式

    包含5个识别图片验证码的类,分别对应不同5种不同的验证码 其中用了两种不同的实现方式(截取采样像素比对+Tesseract-OCR识别) 附带一个图像指纹类(判定图片相似度)和一个寻找联通线的类(八皇后算法实现)

    java图片验证码生成

    java图片验证码生成。有干扰线。随机字符。

    java图片验证码实现示例分享

    ### Java 图片验证码实现原理与示例解析 #### 一、引言 随着网络安全的重要性日益增加,验证码成为了网站登录及表单提交时不可或缺的一部分。它主要用于区分操作者是人类还是自动程序,以此来防止恶意软件的攻击。...

    java验证码生成验证

    csdn上三种java验证码生成方法,以及谷歌开源验证码,总共四种验证码生成集合。将生成的四个验证图片放在一个页面上以供比对,全部可以运行。 四种方法分别为: 1. 数字、字母、汉字混合验证码,叠影(给力)、扭曲 ...

    《java 图片验证码生成utils工具类》

    java 生成随机图片验证码 ,字母数组随机组合,加干扰线

Global site tag (gtag.js) - Google Analytics