• 生成图片验证码(VerifyCode)


    package cn.itcast.image;
    
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    import javax.imageio.ImageIO;
    
    import org.junit.Test;
    
    /**
     * 动态生成图片
     * @author HP
     *
     */
    public class Demo {
        @Test
        public void fun() throws FileNotFoundException, IOException{
            /**
             * 1.创建图片缓冲区
             * 2.设置其宽高
             * 3.得到这个图片的绘制环境(得到画笔)
             * 4.保存起来
             * 
             */
            BufferedImage bi = new BufferedImage(70,35,BufferedImage.TYPE_INT_RGB);
            Graphics g = bi.getGraphics();//得到绘制环境
            g.setColor(Color.WHITE);//把环境设置为红色
            g.fillRect(0,0,70,35);//填充矩形;从0,0开始,宽70,高35,即整个图片,即为图片设置背景色
            g.setColor(Color.RED);//把环境设置为红色
            g.drawString("Hello", 2, 35-2);//向图片上写入字符串,其中2,2表示x,y轴的坐标
            
            ImageIO.write(bi, "JPEG",new FileOutputStream("F://xxx.jpg"));
        }
        @Test
        public void fun2() throws FileNotFoundException, IOException{
            VerifyCode vc = new VerifyCode();
            BufferedImage bi = vc.getImage();
            VerifyCode.output(bi,new FileOutputStream("F:/xxx.jpg"));
            
            System.out.println(vc.getText());
        }
    }

    以上是Demo类,下面我们写VerifyCode类

    package cn.itcast.image;
    
    import java.awt.BasicStroke;
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.Random;
    
    import javax.imageio.ImageIO;
    
    public class VerifyCode {
        private int w = 70;
        private int h = 35;
        private Random r = new Random();
        //("宋体“,”华文楷体“,”黑体“,”华文新魏“,”华文隶书“,”微软雅黑”,“楷体_GB2312")
        private String[] fontNames = {"宋体","华文楷书","黑体","微软雅黑","楷体_GB2312"};
        //可选的字符
        private String codes = "23456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
        //背景色
        private Color bgColor = new Color(255,255,255);
        //验证码上的文本
        private String text;
        //生成随机的颜色
        private Color randomColor(){
            int red = r.nextInt(150);
            int green = r.nextInt(150);
            int blue = r.nextInt(150);
            return new Color(red,green,blue);
        }
        //生成随机字体
        private Font randomFont(){
            int index = r.nextInt(fontNames.length);
            String fontName = fontNames(index); //生成随机的字体名称
            int style = r.nextInt(4);//生成随机的样式,0(无样式),1(粗体),2(斜体),3(粗体+斜体)
            int size = r.nextInt(5)+24;//生成随机字号 24-28
            return new Font(fontName,style,size);
            
        }
        
    
        private String fontNames(int index) {
            // TODO Auto-generated method stub
            return null;
        }
        //画干扰线
        private void drawLine(BufferedImage image){
            int num = 3;//一共画三条
            Graphics2D g2 = (Graphics2D)image.getGraphics();
            for(int i=0;i<num;i++){//生成两个点的坐标,即4个值
                int x1 = r.nextInt(w);
                int y1 = r.nextInt(h);
                int x2 = r.nextInt(w);
                int y2 = r.nextInt(h);
                g2.setStroke(new BasicStroke(1.5F));
                g2.setColor(Color.BLUE);//干扰线是蓝色
                g2.drawLine(x1,y1,x2,y2); //划线
            }
        }
            //随机生成一个字符
            private char randomChar(){
                int index = r.nextInt(codes.length());
                return codes.charAt(index);
            }
            private BufferedImage createImage(){
                BufferedImage image = new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);
                Graphics2D g2 = (Graphics2D)image.getGraphics();
                g2.setColor(this.bgColor);
                g2.fillRect(0, 0, w, h);
                return image;
            }
            //调用这个方法得到验证码
        public BufferedImage getImage(){
            BufferedImage image = createImage();//创建图片缓冲区
            Graphics2D g2 = (Graphics2D) image.getGraphics();//得到绘制环境
            StringBuilder sb = new StringBuilder();//用来装载生成的验证文本
            //向图片中画4个字符
            for(int i= 0;i<4;i++){//循环四次
                String s = randomChar()+"";//随机生成一个字符
                sb.append(s);//把字母添加到sb中
                float x = i*1.0F * w/4;//设置当前字符的x轴坐标
                g2.setFont(randomFont());//设置随机字体
                g2.setColor(randomColor());//设置随机颜色
                g2.drawString(s,x,h-5);//画图
            }
            this.text = sb.toString();//把生成的字符串赋给了this.text
            drawLine(image);//添加干扰线
            return image;
        }
        //返回验证码图片上的文本
        public String getText(){
            return text;
        }
        
        //保存图片到指定的输出流
        public static void output(BufferedImage image,OutputStream out) throws IOException{
            ImageIO.write(image, "JPEG", out);
        }
        
    
    }
  • 相关阅读:
    分段随机实践—模拟线上流量
    基于docker的分布式性能测试框架功能验证(二)
    将博客搬家至CSDN
    考研机试 98.棋盘游戏
    考研机试 100.路径打印
    考研机试 102.计算表达式
    考研机试 97.数字反转
    考研机试 90.简单密码
    考研机试 87.鸡兔同笼
    考研机试 79.浮点数加法
  • 原文地址:https://www.cnblogs.com/sunstudy/p/13172464.html
Copyright © 2020-2023  润新知