GitHub 开源地址: https://github.com/zxing/zxing
zxing 二进制包下载地址:http://repo1.maven.org/maven2/com/google/zxing
zxing Maven 仓库地址:https://mvnrepository.com/artifact/com.google.zxing
maven:
com.google.zxing
core
3.4.0
com.google.zxing
javase
3.4.0
工具类:
package com.swxc.core.utils;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.oned.Code128Writer;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import org.springframework.util.StringUtils;
import sun.misc.BASE64Encoder;
import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
/**
* @Author :huangliang
* @Description:
* @Date: Created in 2019/6/28
* @Modify by :
*/
public class CodeUtil {
public static String getQRCode(String content, int width, int height) {
if (!StringUtils.isEmpty(content)) {
ServletOutputStream stream = null;
HashMap hints = new HashMap<>();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
hints.put(EncodeHintType.MARGIN, 0);
try {
QRCodeWriter writer = new QRCodeWriter();
BitMatrix bitMatrix = writer.encode(content, BarcodeFormat.QR_CODE, width, height, hints);
BufferedImage bufferedImage = MatrixToImageWriter.toBufferedImage(bitMatrix);
ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "png", os);
BASE64Encoder encoder = new BASE64Encoder();
String resultImage = new String("data:image/png;base64," + encoder.encode(os.toByteArray()));
return resultImage;
} catch (Exception e) {
} finally {
if (stream != null) {
try {
stream.flush();
stream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
return null;
}
public static String getBarCode(String content, int width, int height) {
try {
Map hints = new HashMap<>();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
hints.put(EncodeHintType.MARGIN, 0);
int realWidth = getBarCodeNoPaddingWidth(width, content, width);
BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.CODE_128, realWidth, height, hints);
BufferedImage bufferedImage = MatrixToImageWriter.toBufferedImage(bitMatrix);
ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "png", os);
BASE64Encoder encoder = new BASE64Encoder();
String resultImage = new String("data:image/png;base64," + encoder.encode(os.toByteArray()));
return resultImage;
} catch (Exception e) {
return null;
}
}
private static int getBarCodeNoPaddingWidth(int expectWidth, String contents, int maxWidth) {
boolean[] code = new Code128Writer().encode(contents);
int inputWidth = code.length;
double outputWidth = (double) Math.max(expectWidth, inputWidth);
double multiple = outputWidth / inputWidth;
//优先取大的
int returnVal = 0;
int ceil = (int) Math.ceil(multiple);
if (inputWidth * ceil <= maxWidth) {
returnVal = inputWidth * ceil;
} else {
int floor = (int) Math.floor(multiple);
returnVal = inputWidth * floor;
}
return returnVal;
}
}
使用:
int QRWidth = Integer.parseInt(params.get("QRWidth").toString()); int QRHeight = Integer.parseInt(params.get("QRHeight").toString()); int BarWidth = Integer.parseInt(params.get("BarWidth").toString()); int BarHeight = Integer.parseInt(params.get("BarHeight").toString()); String randomCode = getRandomCode(); String QRCode = CodeUtil.getQRCode(randomCode, QRWidth, QRHeight); String BarCode = CodeUtil.getBarCode(randomCode, BarWidth, BarHeight); Map map = new HashMap<>(); map.put("QRCode", QRCode); map.put("BarCode", BarCode); map.put("randomCode", randomCode);