Java生成海报带二维码,原图或base64返回

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;
	}
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wscwsc58888

只为正式环境创作

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值