最近接到一个解析一张图片的二维码和条形码的需求,但是图片中二维码和条形码的数量有可能存在多个网上未找到满意的答案,所以特此记录一下。
- 添加依赖
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.1.14</version>
</dependency>
- 二维码和条形码的生成
package com.test.myqrcode.util;
import cn.hutool.core.io.FileUtil;
import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.extra.qrcode.QrConfig;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import java.io.FileOutputStream;
/**
* <p>
*
* </p>
*
* @author jisen
* @Date 2019-10-12
*/
public class QRCodeUtil {
/**
* 生成二维码
* @param contents 内容
* @param filePath 路径
*/
public static void generateQrcode(String contents, String filePath) {
QrConfig config = new QrConfig(300, 300);
// 设置边距,既二维码和背景之间的边距
config.setMargin(3);
// // 设置前景色,既二维码颜色(青色)
// config.setForeColor(Color.CYAN.getRGB());
// // 设置背景色(灰色)
// config.setBackColor(Color.GRAY.getRGB());
// 生成二维码到文件,也可以到流
QrCodeUtil.generate(contents, config, FileUtil.file(filePath));
}
/**
* 生成条形码
* @param contents 内容
* @param filePath 路径
*/
public static void encodeBar(String contents, String filePath) {
// 条形码的最小宽度
int codeWidth = 98;
codeWidth = Math.max(codeWidth, 105);
try {
BitMatrix bitMatrix = new MultiFormatWriter().encode(contents,
BarcodeFormat.EAN_13, codeWidth, 50, null);
MatrixToImageWriter.writeToStream(bitMatrix, "jpg",
new FileOutputStream(filePath));
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
String contents = "123456789123";
String filePath = "/Users/jisen/Desktop/456.jpg";
generateQrcode(contents,filePath);
// encodeBar(contents,filePath);
}
}
- 解析
/**
* 获取二维码和条形码解析结果
* @param file
* @return
*/
public static List<String> getQRresult(File file) {
try {
BufferedImage bufferedImage = ImageIO.read(file);
HashMap hints = new HashMap<>(1);
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
LuminanceSource source = new BufferedImageLuminanceSource(bufferedImage);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
MultiFormatReader multiFormatReader = new MultiFormatReader();
Result[] results = new GenericMultipleBarcodeReader(multiFormatReader).decodeMultiple(bitmap, hints);
List<String> resultList = new ArrayList<>(results.length);
for (Result result : results) {
resultList.add(result.getText());
}
return resultList;
} catch (Exception e) {
log.info("解析错误");
}
return Collections.emptyList();
}