package cn.iocoder.yudao.module.wxcp.framework.qrcode;
|
|
import com.google.zxing.BarcodeFormat;
|
import com.google.zxing.EncodeHintType;
|
import com.google.zxing.client.j2se.MatrixToImageWriter;
|
import com.google.zxing.common.BitMatrix;
|
import com.google.zxing.qrcode.QRCodeWriter;
|
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
|
|
import java.io.ByteArrayOutputStream;
|
import java.util.HashMap;
|
import java.util.Map;
|
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
import static cn.iocoder.yudao.module.wxcp.enums.ErrorCodeConstants.QRCODE_GENERATE_FAILED;
|
|
/**
|
* 企业微信模块 - 二维码生成工具
|
*
|
* 用于把活动报名页地址生成二维码图片,供企业微信推送或后台下载
|
*
|
* @author 超级管理员
|
*/
|
public class WxCpQrCodeUtil {
|
|
/**
|
* 默认二维码边长(像素)
|
*/
|
public static final int DEFAULT_SIZE = 400;
|
|
private WxCpQrCodeUtil() {
|
}
|
|
/**
|
* 生成二维码 PNG 字节流
|
*
|
* @param content 二维码内容(一般是一个 URL)
|
* @param size 边长像素,传 0 或负数则使用默认值
|
* @return PNG 图片字节
|
*/
|
public static byte[] generatePng(String content, int size) {
|
int actualSize = size > 0 ? size : DEFAULT_SIZE;
|
try {
|
Map<EncodeHintType, Object> hints = new HashMap<>(4);
|
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
|
// 容错级别 M:约 15%,兼顾扫码成功率与码点密度,适合印在物料上
|
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
|
hints.put(EncodeHintType.MARGIN, 1);
|
|
BitMatrix matrix = new QRCodeWriter().encode(content, BarcodeFormat.QR_CODE,
|
actualSize, actualSize, hints);
|
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
MatrixToImageWriter.writeToStream(matrix, "PNG", out);
|
return out.toByteArray();
|
} catch (Exception e) {
|
throw exception(QRCODE_GENERATE_FAILED);
|
}
|
}
|
|
}
|