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(); } } }
使用图像IO流(BufferedImage)生成验证码
最新推荐文章于 2023-01-12 08:19:50 发布