使用图像IO流(BufferedImage)生成验证码

package os;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Random;

/**
 * 生成验证码
 */
public class Img07 {
    public static void main(String[] args) {
        checkNum();
    }

    private static void checkNum() {
        Random rand = new Random();
        int weight = 120;
        int height = 35;
        //建立透明画布
        BufferedImage img = new BufferedImage(weight, height, 2);

        //建立画笔
        Graphics2D d = img.createGraphics();
        //设置线条和文件的,抗锯齿(平滑)
        d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);
        d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT);
        //为画布增加边框先线条
        d.drawRect(0, 0, weight - 1, height - 1);
        //向建立的画布中添加字符串
        String s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
        int len = 4;
        StringBuilder su = new StringBuilder();
        for (int i = 0; i < len; i++) {
            int x = i * 25 + 20;
            int y = 25;
            //设置字体及大小
            Font font = new Font("宋体", Font.BOLD, 30);
            d.setFont(font);
            //随机文字和随机颜色
            d.setColor(new Color(rand.nextInt(256), rand.nextInt(256), rand.nextInt(256), rand.nextInt(100) + 100));
            String t = String.valueOf(s.charAt(rand.nextInt(s.length())));
            //旋转
            su.append(t);
           /* double radianPercent = Math.PI * (rand.nextInt(35) / 180D);
            if (rand.nextBoolean()) {
                radianPercent = -radianPercent;
            }
            d.rotate(radianPercent, x, y);
            d.drawString(t, x, y);
            d.rotate(-radianPercent, x, y);*/
            d.drawString(t, x, y);
        }

        //在控制台打印输出索生成的验证码
        System.out.println(su);

        //添加干扰文字
        for (int i = 0; i <50 ; i++) {
            String j =String.valueOf(s.charAt(rand.nextInt(s.length())));
            d.setColor(new Color(rand.nextInt(256),rand.nextInt(256),rand.nextInt(256),rand.nextInt(50)+50));
            d.setFont(new Font("",Font.BOLD,10));
            int x = rand.nextInt(160);
            int y = rand.nextInt(35);
            d.drawString(j,x,y);

        }
        //添加干扰图像
        for (int i = 0; i <30 ; i++) {
            d.setColor(new Color(rand.nextInt(256),rand.nextInt(256),rand.nextInt(256),rand.nextInt(50)+50));
            int x = rand.nextInt(160);
            int y = rand.nextInt(35);
            d.fillOval(x,y, rand.nextInt(10)+10, rand.nextInt(10+10));

        }

        //输出图片
        try {
            ImageIO.write(img, "png", new File("moddo1/src/checkNum.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,这是一个技术问题,我可以回答。您可以通过使用Java中的BufferedImage类和Graphics类来生成验证码图片。您需要生成随机数,并将其画到图片上,可以使用Font类设置字体样式,使用Color类设置字体颜色。最后,将图片保存在本地即可。 ### 回答2: Java生成四位验证码图片的步骤如下: 1. 导入所需的类和包。在Java中,我们可以使用javax.imageio包中的ImageIO类创建和保存图像文件,使用java.awt包中的BufferedImage类创建图像对象,以及使用java.awt.image包中的ColorModel类和ImageTypeIntArgbPre类设置图像属性。 2. 创建一个BufferedImage对象。BufferedImage是一个表示图像数据缓冲区的类,我们可以将其用于存储生成验证图像。需要指定图像的宽度和高度,以及图像的类型,这里我们选择使用TYPE_INT_ARGB_PRE类型,即32位彩色图像。 3. 获取图像的Graphics对象。Graphics是一个Java抽象类,它提供了在图像上绘制图形和图像的方法。可以通过调用BufferedImage对象的getGraphics()方法来获取Graphics对象。 4. 设置图像的背景色。可以使用Graphics对象的setColor()方法来设置背景色,再使用fillRect()方法根据指定的位置和大小绘制一个填充了指定颜色的矩形作为背景。 5. 绘制验证码文字。可以使用Graphics对象的setFont()方法设置字体样式,再使用drawString()方法根据指定的位置和内容绘制验证码文字。 6. 保存图像。可以使用ImageIO类的write()方法将生成验证图像保存到指定的文件路径。 需要注意的是,生成验证码的文本可以使用随机数生成,可以通过Random类生成4位随机数字或者使用UUID生成4位随机字符串。 以上就是Java生成四位验证码图片的基本步骤。根据具体需求,还可以进行更加详细的图像处理和美化操作,例如添加干扰线、噪点等来增加验证码的复杂度和安全性。 ### 回答3: Java生成四位验证码图片的步骤如下: 1. 首先,导入相关的Java图形库,比如AWT和BufferedImage。 2. 创建一个BufferedImage对象,指定宽度和高度,用于生成验证码图片。 3. 获取Graphics2D对象,用于在图片上绘制字符。 4. 创建一个随机数生成器,用于生成随机字符。 5. 定义一个字符串变量,用于存储生成验证码。 6. 使用一个for循环来生成四位验证码。在循环中,随机生成一个字符,并使用Graphics2D对象将字符绘制到图片上。将生成的字符添加到验证码字符串变量中。 7. 为验证码图片添加一些干扰线和干扰点,增加图片的复杂度和防止机器识别。 8. 绘制完成后,将验证码图片保存到指定的文件路径。 下面是一个简单的示例代码: ``` import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.Random; import javax.imageio.ImageIO; public class CaptchaGenerator { public static void main(String[] args) { int width = 120; int height = 30; // 创建一个BufferedImage对象 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D g2d = (Graphics2D) image.getGraphics(); // 设置背景颜色 g2d.setColor(Color.WHITE); g2d.fillRect(0, 0, width, height); // 设置字体 g2d.setFont(new Font("Arial", Font.PLAIN, 20)); Random random = new Random(); StringBuilder captcha = new StringBuilder(); // 生成四位验证码 for (int i = 0; i < 4; i++) { // 随机生成一个字符 char c = (char) (random.nextInt(26) + 'A'); g2d.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256))); g2d.drawString(String.valueOf(c), 20 * i + 10, 20); // 添加到验证码中 captcha.append(c); } // 添加干扰线 for (int i = 0; i < 4; i++) { g2d.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256))); g2d.drawLine(random.nextInt(width), random.nextInt(height), random.nextInt(width), random.nextInt(height)); } // 添加干扰点 for (int i = 0; i < 100; i++) { g2d.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256))); g2d.fillRect(random.nextInt(width), random.nextInt(height), 1, 1); } // 保存验证码图片 try { ImageIO.write(image, "png", new File("captcha.png")); } catch (IOException e) { e.printStackTrace(); } System.out.println("验证码为:" + captcha.toString()); } } ``` 以上就是用Java生成四位验证码图片的简单示例代码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值