使用BufferedImage做的一个简单的图片验证码
使用Spring Boot 做了一个验证码图片,在中间有用到BufferedImage生成图片这里参考了以下文章
链接: SpringBoot如何优雅的使用@ResponseBody返回图片
本来是想用其中的第二个方法的,比较简单,但是在返回的时候却报了406的错误,暂时没有办法解决,所以继续使用了文章中的第一种方法,把BufferedImage转成了byte[]再进行返回的。参考了这个文章
链接: BufferedImage与byte[]互转
最后终于是可以了

代码
代码如下:
package com.fanlanv.springbootweb.controller;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Random;
@Controller
@RequestMapping
public class ValidCode {
//这里使用了produces指定返回类型,如果没有指定会报错
@GetMapping(value = "/validCode", produces = MediaType.IMAGE_JPEG_VALUE)
@ResponseBody
public byte[] validCode() throws IOException {
//定义一个BufferedImage
BufferedImage image = new BufferedImage(200, 100, BufferedImage.TYPE_INT_RGB);
Graphics graphics = image.createGraphics();
//定义颜色
graphics.setColor(Color.WHITE);
graphics.fillRect(0, 0, 200, 100);
//产生4个随机数
ArrayList<Integer> list = new ArrayList<Integer>();
Random random = new Random();
for(int i = 0; i < 4; i++) {
list.add(random.nextInt(10));
}
//设置字体 宋体 加粗 大小为50
graphics.setFont(new Font("宋体", Font.BOLD, 45));
//定义一个颜色数组
Color[] colors = new Color[]{Color.blue, Color.BLACK, Color.GREEN, Color.RED, Color.ORANGE};
for(int i = 0; i < list.size(); i++) {
//使用随机颜色
graphics.setColor(colors[random.nextInt(colors.length)]);
//画字符 并使字符高度随机
graphics.drawString("" + list.get(i), i * 50 + 5, 50 + random.nextInt(51) - 10);
}
//画上三条随机的线
for(int i = 0; i < 3; i++) {
graphics.setColor(colors[random.nextInt(colors.length)]);
graphics.drawLine(0, random.nextInt(101), 200, random.nextInt(101));
}
//定义一个二进制数组输出流
ByteArrayOutputStream os = new ByteArrayOutputStream();
//将图片写入输出流
ImageIO.write(image, "jpg", os);
//返回结果
return os.toByteArray();
}
}