<img src="/cn-user/inviter-code-image.html?width=130&inviterCode=<s:property value="inviterURL"/>">
导包:
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
</dependency>
使用教程:
public String inviterCodeImage() {
try {
if (width <= 0) {
width = 200;
}
var response = ServletActionContext.getResponse();
///cn-user/inviter-code-image.html?width=130&inviterCode=https://www.medchemexpress.cn/integral-invitation-code-form.html?inviter-code=847231841027573182527186725995
//inviterCode为二维码扫描内容 width为宽度
byte[] bs = ImageUtils.createQRCodeImage(inviterCode, width);
response.setHeader("Cache-Control", "no-store");
response.setContentType("image/png");
response.setContentLength(bs.length);
response.getOutputStream().write(bs);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
工具类:
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import lombok.extern.slf4j.Slf4j;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.HashMap;
import java.util.Map;
@Slf4j
public class ImageUtils {
public static final String FORMAT_JPG = "jpg";
public static final String FORMAT_PDF = "pdf";
public static final String FORMAT_PNG = "png";
public static final String FORMAT_GIF = "gif";
public static final String FORMAT_BMP = "bmp";
private ImageUtils() {
}
/**
* 图片压缩
* @param maxWidth
* @param maxHeight
* @param bytes
* @return
*/
public static byte[] thumbnail(int maxWidth, int maxHeight, byte[] bytes) {
var imageBuffer = new ByteArrayInputStream(bytes);
BufferedImage srcImage;
try {
srcImage = ImageIO.read(imageBuffer);
} catch (Exception ignore) {
return null; // impossible
}
int srcWidth = srcImage.getWidth();
int srcHeight = srcImage.getHeight();
int thumbnailWidth = maxWidth;
int thumbnailHeight = maxHeight;
if (srcWidth >= srcHeight) {
thumbnailHeight = thumbnailWidth * srcHeight / srcWidth;
} else {
thumbnailWidth = thumbnailHeight * srcWidth / srcHeight;
}
var thumbnailImage = new BufferedImage(thumbnailWidth, thumbnailHeight, BufferedImage.TYPE_INT_RGB);
var thumbnailGraphics = thumbnailImage.createGraphics();
try {
var scaledImage = srcImage.getScaledInstance(thumbnailWidth, thumbnailHeight, Image.SCALE_SMOOTH);
thumbnailGraphics.drawImage(scaledImage, 0, 0, thumbnailWidth, thumbnailHeight, null);
} finally {
thumbnailGraphics.dispose();
}
try (var outBuffer = new ByteArrayOutputStream()) {
ImageIO.write(thumbnailImage, "png", outBuffer);
return outBuffer.toByteArray();
} catch (Exception ignore) {
return null; // impossible
}
}
/**
* 获取图片后缀
* @param bytes
* @param defaultFormat
* @return
*/
public static String getImageFormatName(byte[] bytes, String defaultFormat) {
try {
var imageStream = ImageIO.createImageInputStream(new ByteArrayInputStream(bytes));
var readerIterator = ImageIO.getImageReaders(imageStream);
if (readerIterator.hasNext()) {
var reader = readerIterator.next();
var format = reader.getFormatName().toLowerCase();
// 文件格式名参考 PNGImageReaderSpi,大体可用,只是 JPG 搞特殊,额外处理一下
if ("jpeg".equals(format)) {
format = FORMAT_JPG;
}
return format;
}
} catch (Exception ignore) {
}
return defaultFormat;
}
/**
* 创建二维码图片
* @param text
* @param width
* @return
*/
public static byte[] createQRCodeImage(String text, int width) {
var hints = new HashMap<EncodeHintType, Object>();
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
hints.put(EncodeHintType.MARGIN, 0);
return createQRCodeImage(text, width, hints);
}
/**
* 创建二维码图片
* @param text
* @param width
* @param 二维码图片微调参数
* @return
*/
public static byte[] createQRCodeImage(String text, int width, Map<EncodeHintType, Object> hints) {
try {
var writer = new QRCodeWriter();
@SuppressWarnings("SuspiciousNameCombination")
var matrix = writer.encode(text, BarcodeFormat.QR_CODE, width, width, hints);
var buffer = new ByteArrayOutputStream();
MatrixToImageWriter.writeToStream(matrix, "PNG", buffer);
return buffer.toByteArray();
} catch (Exception e) {
log.error("create qrcode image", e);
return new byte[0];
}
}
}