1、pom.xml文件引入
<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.2.3</version> </dependency> <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.3.3</version> </dependency>
2、實現代碼
package app.action.test; import cn.hutool.extra.qrcode.QrCodeUtil; import cn.hutool.extra.qrcode.QrConfig; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; public class QRcodeTest { public static void main(String[] args) { BufferedImage qrCodeImage = generateQrCode("https://www.baidu.com/", "C:\\Users\\saq\\Desktop\\QR\\11.jpg"); createPicture(qrCodeImage, "C:\\Users\\saq\\Desktop\\QR\\123.png", "打開微信掃一掃辦理Hello World", "C:\\Users\\saq\\Desktop\\QR\\321.png"); } /** * 生成中間帶logo的二維碼 * * @param content 二維碼內容 * @param logoPath logo圖標的地址 * @return */ public static BufferedImage generateQrCode(String content, String logoPath) { BufferedImage image = QrCodeUtil.generate( content, // 二維碼內容 QrConfig.create().setImg(logoPath)// 附帶logo .setWidth(290) // 二維碼的寬 .setHeight(290) // 二維碼的高 .setMargin(0)); // 邊距 return image; } /** * 帶文字和背景圖片的二維碼創建 * * @param image 生成的二維碼 * @param bgPath 背景圖片的路徑 * @param text 二維碼上的文字 * @param savePath 生成圖片的保存位置 * @throws IOException */ public static void createPicture(BufferedImage image, String bgPath, String text, String savePath) { try { // 首先先畫背景圖片 BufferedImage backgroundImage = ImageIO.read(new File(bgPath)); // 背景圖片的寬度 int bgWidth = backgroundImage.getWidth(); // 二維碼的寬度 int qrWidth = image.getWidth(); // 二維碼距離背景圖片橫坐標(X)的距離,居中顯示 int distanceX = (bgWidth - qrWidth) / 2; // 二維碼距離背景圖片縱坐標(Y)的距離 int distanceY = distanceX; // 基於圖片backgroundImage對象打開繪圖 Graphics2D rng = backgroundImage.createGraphics(); rng.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP)); rng.drawImage(image, distanceX, distanceY, null); //設置字體 Font font = new Font("宋體", Font.PLAIN, 22); rng.setFont(font); rng.setColor(Color.red); // 獲取當前文字的對象 FontMetrics metrics = rng.getFontMetrics(font); // 文字在圖片中的坐標 這里設置在中間 int startX = (bgWidth - metrics.stringWidth(text)) / 2; //當前文字對象到橫坐標(X)的距離 int startY = backgroundImage.getHeight() - 60; //當前文字對象到縱坐標(Y)的距離 rng.drawString(text, startX, startY); // 處理繪圖 rng.dispose(); image = backgroundImage; image.flush(); // 將繪制好的圖片寫入當前路徑中 ImageIO.write(image, "png", new File(savePath)); } catch (IOException e) { e.printStackTrace(); } } }
3、效果圖