好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

java生成验证码图片的方法

本文实例为大家分享了java生成验证码图片的具体代码,供大家参考,具体内容如下

示例一:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

import org.apache测试数据mons.codec.binary.Base64;

import org.apache测试数据mons.lang.RandomStringUtils;

import org.apache测试数据mons.lang.StringUtils;

 

import javax.imageio.ImageIO;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpSession;

import java.awt.*;

import java.awt.image.BufferedImage;

import java.io.ByteArrayOutputStream;

import java.util.Random;

 

 

 

public class RandomVerifyCode {

 

   private static final String RANDOM_NUM = "23456789" ;

   private static final String RANDOM_LETTER = "ABCDEFGHJKMNPQRSTUVWXYZ" ;

   private static final String RANDOM_LETTER_SMALL = "abcdefghjkmnpqrstuvwxyz" ;

   private static final String RANDOM_STRING = RANDOM_NUM + RANDOM_LETTER + RANDOM_LETTER_SMALL;

 

   private int width = 95 ; // 图片宽

   private int height = 25 ; // 图片高

   private int lineSize = 40 ; // 干扰线数量

   private int stringNum = 4 ; // 随机产生字符数量

 

   private Random random = new Random();

 

 

   /**

    * 获得字体

    */

   private Font getFont() {

     return new Font( "Fixedsys" , Font.CENTER_BASELINE, 18 );

   }

 

   /**

    * 获得颜色

    */

   private Color getRandColor( int fc, int bc) {

     if (fc > 255 )

       fc = 255 ;

     if (bc > 255 )

       bc = 255 ;

     int r = fc + random.nextInt(bc - fc - 16 );

     int g = fc + random.nextInt(bc - fc - 14 );

     int b = fc + random.nextInt(bc - fc - 18 );

     return new Color(r, g, b);

   }

 

   /**

    * 生成随机图片(BASE64格式)

    */

   public String getRandcode(HttpServletRequest request, StringBuffer imgBuffer) {

     // BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类

     BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);

     Graphics g = image.getGraphics(); // 产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作

     g.fillRect( 0 , 0 , width, height); //图片大小

     g.setFont( new Font( "Times New Roman" , Font.ROMAN_BASELINE, 18 )); //字体大小

     g.setColor(getRandColor( 110 , 133 )); //字体颜色

     // 绘制干扰线

     for ( int i = 0 ; i <= lineSize; i++) {

       drowLine(g);

     }

     // 绘制随机字符

     String randomString = "" ;

     for ( int i = 1 ; i <= stringNum; i++) {

       randomString = drowString(g, randomString, i);

     }

     g.dispose();

     ByteArrayOutputStream out = new ByteArrayOutputStream();

     String encode = null ;

     try {

       // 将内存中的图片通过流动形式输出到客户端

       ImageIO.write(image, "JPEG" , out);

       encode = "data:image/jpeg;base64," +Base64.encodeBase64String(out.toByteArray());

       out.close();

     } catch (Exception e) {

       LogHelper.error( "登陆控制" , "验证码生成" , "将内存中生成的验证码图片输出为BASE64格式编码失败!" );

     }

     imgBuffer.append(encode);

     return randomString;

   }

 

 

   /**

    * 绘制字符串

    */

   private String drowString(Graphics g, String randomString, int i) {

     g.setFont(getFont());

     g.setColor( new Color(random.nextInt( 101 ), random.nextInt( 111 ), random

         .nextInt( 121 )));

     String rand = String.valueOf(getRandomString(random.nextInt(RANDOM_STRING.length())));

     randomString += rand;

     g.translate(random.nextInt( 3 ), random.nextInt( 3 ));

     g.drawString(rand, 13 * i, 16 );

     return randomString;

   }

 

   /**

    * 绘制干扰线

    */

   private void drowLine(Graphics g) {

     int x = random.nextInt(width);

     int y = random.nextInt(height);

     int xl = random.nextInt( 13 );

     int yl = random.nextInt( 15 );

     g.drawLine(x, y, x + xl, y + yl);

   }

 

   /**

    * 获取随机的字符

    */

   public String getRandomString( int num) {

     return String.valueOf(RANDOM_STRING.charAt(num));

   }

 

 

 

   public static String randomString( int length){

     return RandomStringUtils.random(length, RANDOM_STRING.toCharArray());

   }

}

示例二:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

import javax.imageio.ImageIO;

import java.awt.*;

import java.awt.image.BufferedImage;

import java.awt.image.RenderedImage;

import java.io.FileOutputStream;

import java.io.OutputStream;

import java.util.HashMap;

import java.util.Map;

import java.util.Random;

 

public class CodeUtil {

 

   private static int width = 90 ; // 定义图片的width 90

   private static int height = 20 ; // 定义图片的height 20

   private static int codeCount = 4 ; // 定义图片上显示验证码的个数

   private static int xx = 15 ;

   private static int fontHeight = 18 ;

   private static int codeY = 16 ;

   private static char [] codeSequence = { 'A' , 'B' , 'C' , 'D' , 'E' , 'F' , 'G' , 'H' , 'J' , 'K' , 'M' , 'N' , 'P' , 'Q' , 'R' ,

       'S' , 'T' , 'U' , 'V' , 'W' , 'X' , 'Y' , 'Z' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' };

 

   public static Map<String,RenderedImage> codePicMap = new HashMap<>();

 

   /**

    * 生成一个map集合

    * code为生成的验证码

    * codePic为生成的验证码BufferedImage对象

    *

    * @return

    */

   public static Map<String, Object> generateCodeAndPic() {

     // 定义图像buffer

     BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

     // Graphics2D gd = buffImg.createGraphics();

     // Graphics2D gd = (Graphics2D) buffImg.getGraphics();

     Graphics gd = buffImg.getGraphics();

     // 创建一个随机数生成器类

     Random random = new Random();

     // 将图像填充为蓝色

//    gd.setColor(Color.WHITE);

     gd.setColor( new Color( 232 , 240 , 254 ));

     gd.fillRect( 0 , 0 , width, height);

 

     // 创建字体,字体的大小应该根据图片的高度来定。

     Font font = new Font( "Fixedsys" , Font.BOLD, fontHeight);

     // 设置字体。

     gd.setFont(font);

 

     // 画边框。

     gd.setColor(Color.BLACK);

     gd.drawRect( 0 , 0 , width - 1 , height - 1 );

 

     // 随机产生40条干扰线,使图象中的认证码不易被其它程序探测到。

     gd.setColor(Color.BLACK);

     for ( int i = 0 ; i < 10 ; i++) {

       int x = random.nextInt(width);

       int y = random.nextInt(height);

       int xl = random.nextInt( 12 );

       int yl = random.nextInt( 12 );

       gd.drawLine(x, y, x + xl, y + yl);

     }

 

     // randomCode用于保存随机产生的验证码,以便用户登录后进行验证。

     StringBuffer randomCode = new StringBuffer();

     int red = 0 , green = 0 , blue = 0 ;

 

     // 随机产生codeCount数字的验证码。

     for ( int i = 0 ; i < codeCount; i++) {

       // 得到随机产生的验证码数字。

       String code = String.valueOf(codeSequence[random.nextInt( 31 )]);

       // 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。

       red = random.nextInt( 255 );

       green = random.nextInt( 255 );

       blue = random.nextInt( 255 );

 

       // 用随机产生的颜色将验证码绘制到图像中。

       gd.setColor( new Color(red, green, blue));

       gd.drawString(code, (i + 1 ) * xx, codeY);

       // 将产生的四个随机数组合在一起。

       randomCode.append(code);

     }

     Map<String, Object> map = new HashMap<>();

     //存放验证码

     map.put( "code" , randomCode);

     //存放生成的验证码BufferedImage对象

     map.put( "codePic" , buffImg);

     return map;

   }

 

 

   public static void main(String[] args) throws Exception {

     //创建文件输出流对象

     OutputStream out = new FileOutputStream( "D://img/" + System.currentTimeMillis() + ".jpg" );

     Map<String, Object> map = CodeUtil.generateCodeAndPic();

     ImageIO.write((RenderedImage) map.get( "codePic" ), "jpeg" , out);

     System.out.println( "验证码的值为:" + map.get( "code" ));

   }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

原文链接:https://blog.csdn.net/iloki/article/details/113996064

查看更多关于java生成验证码图片的方法的详细内容...

  阅读:22次