2021SC@SDUSC
文章目录
- 一、Zxing中的multi目录
- 二、扫码器QRCodeMultiReader
- 三、定位器MultiDetector
- 四、测试样例
在之前的例子中,展示的都是针对单个码进行解码,但是在生活中会出现同时扫描两个二维码的情况,这种时候应该怎么解码呢?本节将对Zxing这一部分代码进行解读。
一、Zxing中的multi目录
为了方便介绍各类之间的关系,将Detector和Reader也加入到UML图中。可以大概了解到:对于多个码同时存在的情况,定位方法MultiDetector继承了Detector;但是解析方法是对Decode的调用;而解码器QRCodeMultiReader则是通过接口实现了多继承。我们解读这部分源码的重点是Zxing如何定位、存储多个二维码的。

二、扫码器QRCodeMultiReader
三、定位器MultiDetector
四、测试样例
我们通过Zxing的测试来展示对于多个二维码同时存在的扫码过程。这是Zxing官方给出的测试图片,我们要测试同时解析4个二维码的情况。在之前的扫码中,由于我们只针对一个码进行解析,其结果返回是一个result;但是现在有多个码,结果就是一个数组的result。

@Test
public void testMultiQRCodes() throws Exception {
//读取图片
Path testBase = AbstractBlackBoxTestCase.buildTestBase("src/test/resources/blackbox/multi-qrcode-1");
Path testImage = testBase.resolve("1.png");
//解码的套路操作,前面详细讲述了,这里不做赘述
BufferedImage image = ImageIO.read(testImage.toFile());
LuminanceSource source = new BufferedImageLuminanceSource(image);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
// 我们主要关注MultipleBarcodeReader
MultipleBarcodeReader reader = new QRCodeMultiReader();
// 在之前的解码中,result是单个的对象,但是在这里result是以数组的方式展示的
Result[] results = reader.decodeMultiple(bitmap);
//判断解析结果是否为空及是否长度为4
assertNotNull(results);
assertEquals(4, results.length);
Collection<String> barcodeContents = new HashSet<>();
for (Result result : results) {
//输出测试结果
System.out.println(result.getText());
System.out.println(result.getResultPoints()[0]+" "+result.getResultPoints()[1]+" "+result.getResultPoints()[2]+" "+result.getResultPoints()[3]);
//在HashSet中加入解析的文字结果
barcodeContents.add(result.getText());
assertEquals(BarcodeFormat.QR_CODE, result.getBarcodeFormat());
assertNotNull(result.getResultMetadata());
}
//判断解析结果是否正确
Collection<String> expectedContents = new HashSet<>();
expectedContents.add("You earned the class a 5 MINUTE DANCE PARTY!! Awesome! Way to go! Let's boogie!");
expectedContents.add("You earned the class 5 EXTRA MINUTES OF RECESS!! Fabulous!! Way to go!!");
expectedContents.add("You get to SIT AT MRS. SIGMON'S DESK FOR A DAY!! Awesome!! Way to go!! Guess I better clean up! :)");
expectedContents.add("You get to CREATE OUR JOURNAL PROMPT FOR THE DAY! Yay! Way to go! ");
assertEquals(expectedContents, barcodeContents);
}
打印一下文本结果和部分定位点信息,可以看到成功同时解析了4个二维码:

Zxing的测试代码和测试图片都很全面也很规范,包含了单元测试、集成测试等,对于理解源码很有帮助。
欢迎提出宝贵意见,感谢观看!
参考: ZxingAPI
