<!-- pom引入jar包 -->
<!-- 二维码生成 -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.1.0</version>
</dependency>
package com.zhx.util; import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.MultiFormatWriter; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; import sun.misc.BASE64Encoder; import javax.imageio.ImageIO; import java.awt.*; import java.awt.geom.RoundRectangle2D; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.File; import java.util.Hashtable; //二维码生成工具类 public class ErweimaUtil { private static final String CHARSET = "utf-8"; private static final String FORMAT_NAME = "JPG"; // 二维码尺寸 private static final int QRCODE_SIZE = 300; // LOGO宽度 private static final int WIDTH = 60; // LOGO高度 private static final int HEIGHT = 60; public static void main(String[] args) { try { BufferedImage img = createImage("该公司没有信用名片",null,true); String b64 = bfimgToBase64(img); System.out.println("data:image/png;base64,"+b64); } catch (Exception e) { e.printStackTrace(); } } //把图片存入字符流 public static BufferedImage createImage(String content,String imgPath,boolean needCompress) throws Exception { Hashtable hints = new Hashtable(); hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); hints.put(EncodeHintType.CHARACTER_SET, CHARSET); hints.put(EncodeHintType.MARGIN, 1); BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE, hints); int width = bitMatrix.getWidth(); int height = bitMatrix.getHeight(); BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF); } } if(imgPath == null || "".equals(imgPath)){ return image; } ErweimaUtil.insertImage(image,imgPath,needCompress); return image; } //把图片字符流转成base64 public static String bfimgToBase64(BufferedImage bufferedImage){ String imgBase64 = null; try { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ImageIO.write(bufferedImage, "jpeg", outputStream); BASE64Encoder encoder = new BASE64Encoder(); imgBase64 = encoder.encode(outputStream.toByteArray()).trim().replaceAll("\\s", "").replaceAll("\r", "").replaceAll("\n", ""); } catch (Exception e) { e.printStackTrace(); } return imgBase64; } public static void insertImage(BufferedImage source, String imgPath, boolean needCompress) throws Exception { File file = new File(imgPath); if (!file.exists()) { System.err.println(""+imgPath+" 该文件不存在!"); return; } Image src = ImageIO.read(new File(imgPath)); int width = src.getWidth(null); int height = src.getHeight(null); if (needCompress) { // 压缩LOGO if (width > WIDTH) { width = WIDTH; } if (height > HEIGHT) { height = HEIGHT; } Image image = src.getScaledInstance(width, height, Image.SCALE_SMOOTH); BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics g = tag.getGraphics(); g.drawImage(image, 0, 0, null); // 绘制缩小后的图 g.dispose(); src = image; } // 插入LOGO Graphics2D graph = source.createGraphics(); int x = (QRCODE_SIZE - width) / 2; int y = (QRCODE_SIZE - height) / 2; graph.drawImage(src, x, y, width, height, null); Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6); graph.setStroke(new BasicStroke(3f)); graph.draw(shape); graph.dispose(); } }
//controll调用
@RequestMapping("/toGenerateQrCode") public ModelAndView toGenerateQrCode(String sellers_id, String goods_id, ModelAndView modelAndView) throws Exception { BufferedImage image = null; if("".equals(goods_id) || goods_id == null){ image = ErweimaUtil.createImage("123456","",true); }else { image = ErweimaUtil.createImage("789","",true); } String b64 = ErweimaUtil.bfimgToBase64(image);//转成base64 String qrcode = "data:image/png;base64," + b64;//图片url modelAndView.addObject("qrcode",qrcode); modelAndView.addObject("goods_id",goods_id); modelAndView.addObject("sellers_id",sellers_id); modelAndView.setViewName("/resellerGoods/goodsQrCode"); return modelAndView; }
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.w3.org/1999/xhtml"> <head> <meta charset="UTF-8"/> <title>二维码图片</title> <div th:replace="head"></div> </head> <body> <div id="qrCode"> <image th:src="${qrcode}"></image> </div>//二维码地址 <a th:href="${qrcode}" download="二维码.jpg">下载二维码</a> </body> </html>