Maven引入包;
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.3</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.3.3</version>
</dependency>
<!-- 工具包 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.6.2</version>
</dependency>
代码
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Base64;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.gdhz.token.PassToken;
import com.java.st.lib.tools.io.URLResourceUtil;
import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.extra.qrcode.QrConfig;
@RestController
@RequestMapping("/qrCode")
public class QRCodeController {
/**
*
* @param code 二维码内容
* @param isPoster 是否带海报
* @param response
* @throws Exception
*/
@PassToken
@RequestMapping("")
public void getCode(String code, boolean isPoster,boolean isBase64, HttpServletResponse response) throws Exception {
if (!StringUtils.isEmpty(code)) {
response.setDateHeader("Expires", 0);
response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
response.addHeader("Cache-Control", "post-check=0, pre-check=0");
response.setHeader("Pragma", "no-cache");
// 二维码图
BufferedImage qrcodeImage = QrCodeUtil.generate(code, new QrConfig(350, 350));
// 是否带海报
if (isPoster) {
// 背景图
BufferedImage bgImage = ImageIO.read(URLResourceUtil.asFile("classpath:card.jpg"));
// 画笔
Graphics2D graphics2d = bgImage.createGraphics();
// 背景图上画二维码
drawImage(graphics2d, qrcodeImage, 200, 230);
// 释放图形上下文,以及它正在使用的任何系统资源。
graphics2d.dispose();
if(isBase64) {
ImageIO.write(bgImage, "jpg", Base64.getEncoder().wrap(response.getOutputStream()));
}else {
ImageIO.write(bgImage, "jpg", response.getOutputStream());
}
} else {
if(isBase64) {
ImageIO.write(qrcodeImage, "jpg", Base64.getEncoder().wrap(response.getOutputStream()));
}else {
ImageIO.write(qrcodeImage, "jpg", response.getOutputStream());
}
}
}
}
/**
* 绘制 图片
*
* @param graphics 画笔
* @param bufferImage 图片资源
* @param x 坐标 x
* @param y 坐标 y
* @return
* @throws Exception
*/
public static Graphics2D drawImage(Graphics2D graphics, BufferedImage bufferImage, int x, int y) throws Exception {
graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
graphics.drawImage(bufferImage, x, y, null);
return graphics;
}
}
升级版(自定义海报,二维码大小)
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.net.URL;
import java.util.Base64;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.gdhz.token.PassToken;
import com.java.st.lib.tools.io.URLResourceUtil;
import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.extra.qrcode.QrConfig;
import lombok.extern.log4j.Log4j2;
@RestController
@RequestMapping("/qrCode")
@Log4j2
public class QRCodeController {
/**
*
* @param code 二维码内容
* @param isPoster 是否带海报
* @param isBase64 是否base64返回
* @param posterImgUrl 海报背景
* @param qrWidth 二维码宽
* @param qrheight 二维码高
* @param bgX 背景图的X坐标
* @param bgY 背景图的Y坐标
* @throws Exception
*/
@PassToken
@RequestMapping("")
public void getCode(String code, boolean isPoster, boolean isBase64, String posterImgUrl, Integer qrWidth,
Integer qrheight, Integer bgX, Integer bgY, HttpServletResponse response) throws Exception {
if (!StringUtils.isEmpty(code)) {
response.setDateHeader("Expires", 0);
response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
response.addHeader("Cache-Control", "post-check=0, pre-check=0");
response.setHeader("Pragma", "no-cache");
// 二维码默认长,宽,二维码的X,Y坐标位置
int defaultQrWidth = 350, defaultQrheight = 350, defaultBgX = 200, defaultBgY = 230;
if (qrWidth != null && qrWidth > 0) {
defaultQrWidth = qrWidth;
}
if (qrheight != null && qrheight > 0) {
defaultQrheight = qrheight;
}
if (bgX != null && bgX > 0) {
defaultBgX = bgX;
}
if (bgY != null && bgY > 0) {
defaultBgY = bgY;
}
// 二维码图
BufferedImage qrcodeImage = QrCodeUtil.generate(code, new QrConfig(defaultQrWidth, defaultQrheight));
// 是否带海报
if (isPoster) {
// 背景图
BufferedImage bgImage = null;
if (!StringUtils.isEmpty(posterImgUrl)) {
try {
bgImage = ImageIO.read(new URL(posterImgUrl));
} catch (Exception e) {
log.error("输入的地址不正确,找不到相关图片");
}
}
if (bgImage == null) {
bgImage = ImageIO.read(URLResourceUtil.asFile("classpath:card.jpg"));
}
// 画笔
Graphics2D graphics2d = bgImage.createGraphics();
// 背景图上画二维码
drawImage(graphics2d, qrcodeImage, defaultBgX, defaultBgY);
// 释放图形上下文,以及它正在使用的任何系统资源。
graphics2d.dispose();
if (isBase64) {
ImageIO.write(bgImage, "jpg", Base64.getEncoder().wrap(response.getOutputStream()));
} else {
ImageIO.write(bgImage, "jpg", response.getOutputStream());
}
} else {
if (isBase64) {
ImageIO.write(qrcodeImage, "jpg", Base64.getEncoder().wrap(response.getOutputStream()));
} else {
ImageIO.write(qrcodeImage, "jpg", response.getOutputStream());
}
}
}
}
/**
* 绘制 图片
*
* @param graphics 画笔
* @param bufferImage 图片资源
* @param x 坐标 x
* @param y 坐标 y
* @return
* @throws Exception
*/
public static Graphics2D drawImage(Graphics2D graphics, BufferedImage bufferImage, int x, int y) throws Exception {
graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
graphics.drawImage(bufferImage, x, y, null);
return graphics;
}
}