package com.hkb.soulaud.pojo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class QrImage implements Serializable {
public static final int WIDTH = 300;
public static final int HEIGHT = 300;
private String folderPath;
private String fileName;
private String link;
private String format;
}
package com.hkb.soulaud.tools;
import com.google.zxing.*;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import com.hkb.soulaud.pojo.QrImage;
import lombok.extern.slf4j.Slf4j;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.nio.file.Path;
import java.util.Hashtable;
@Slf4j
public class Qr {
public static void writeQrImage(QrImage image) throws WriterException, IOException {
Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
hints.put(EncodeHintType.MARGIN, 1);
BitMatrix bitMatrix = new MultiFormatWriter().encode(image.getLink(), BarcodeFormat.QR_CODE, QrImage.WIDTH, QrImage.HEIGHT, hints);
final String filePath = image.getFolderPath() + image.getFileName();
File folderFile = new File(image.getFolderPath());
if (folderFile.exists() || folderFile.mkdirs()) {
Path file = new File(filePath).toPath();
MatrixToImageWriter.writeToPath(bitMatrix, image.getFormat(), file);
}
}
public static InputStream getQrInputStream(String content, int width, String picFormat) throws IOException, WriterException {
return new ByteArrayInputStream(getQrByte(content, width, picFormat));
}
public static byte[] getQrByte(String content, int width, String picFormat) throws WriterException, IOException {
BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, width);
BufferedImage image = toBufferedImage(bitMatrix);
ByteArrayOutputStream out = new ByteArrayOutputStream();
ImageIO.write(image, picFormat, out);
return out.toByteArray();
}
public static BufferedImage toBufferedImage(BitMatrix matrix) {
int width = matrix.getWidth();
int height = matrix.getHeight();
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
int onColor = 0xFF000000;
int offColor = 0xFFFFFFFF;
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
image.setRGB(x, y, matrix.get(x, y) ? onColor : offColor);
}
}
return image;
}
public static void readQr(String filepath) throws IOException, NotFoundException {
MultiFormatReader multiFormatReader = new MultiFormatReader();
File file = new File(filepath);
BufferedImage image = null;
BinaryBitmap binaryBitmap = null;
Result result = null;
image = ImageIO.read(file);
binaryBitmap = new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(image)));
result = multiFormatReader.decode(binaryBitmap);
log.debug("读取二维码: {}", result.toString());
log.debug("二维码格式: {}", result.getBarcodeFormat());
log.debug("二维码内容: {}", result.getText());
}
public static void main(String[] args) throws IOException, WriterException {
log.debug(OssFileTools.upload(getQrInputStream("aaa", 100, "png"), "aa.jpg"));
}
}