org.dromara.hutool.extra.qrcode.QrSVG Maven / Gradle / Ivy
The newest version!
/*
* Copyright (c) 2023 looly([email protected])
* Hutool is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
package org.dromara.hutool.extra.qrcode;
import org.dromara.hutool.core.text.StrUtil;
import org.dromara.hutool.swing.img.ImgUtil;
import org.dromara.hutool.swing.img.color.ColorUtil;
import com.google.zxing.common.BitMatrix;
import java.awt.Color;
import java.awt.Image;
/**
* 二维码的SVG表示
*
* @author Tom Xin
*/
public class QrSVG {
private final BitMatrix matrix;
private final QrConfig qrConfig;
/**
* 构造
* @param matrix {@link BitMatrix}
* @param qrConfig {@link QrConfig}
*/
public QrSVG(final BitMatrix matrix, final QrConfig qrConfig) {
this.matrix = matrix;
this.qrConfig = qrConfig;
}
@Override
public String toString() {
final Image logoImg = qrConfig.img;
final Integer foreColor = qrConfig.foreColor;
final Integer backColor = qrConfig.backColor;
final int ratio = qrConfig.ratio;
final StringBuilder sb = new StringBuilder();
final int qrWidth = matrix.getWidth();
int qrHeight = matrix.getHeight();
final int moduleHeight = (qrHeight == 1) ? qrWidth / 2 : 1;
for (int y = 0; y < qrHeight; y++) {
for (int x = 0; x < qrWidth; x++) {
if (matrix.get(x, y)) {
sb.append(" M").append(x).append(",").append(y).append("h1v").append(moduleHeight).append("h-1z");
}
}
}
qrHeight *= moduleHeight;
String logoBase64 = "";
int logoWidth = 0;
int logoHeight = 0;
int logoX = 0;
int logoY = 0;
if (logoImg != null) {
logoBase64 = ImgUtil.toBase64DataUri(logoImg, "png");
// 按照最短的边做比例缩放
if (qrWidth < qrHeight) {
logoWidth = qrWidth / ratio;
logoHeight = logoImg.getHeight(null) * logoWidth / logoImg.getWidth(null);
} else {
logoHeight = qrHeight / ratio;
logoWidth = logoImg.getWidth(null) * logoHeight / logoImg.getHeight(null);
}
logoX = (qrWidth - logoWidth) / 2;
logoY = (qrHeight - logoHeight) / 2;
}
final StringBuilder result = StrUtil.builder();
result.append("");
return result.toString();
}
}