你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

2021SC@SDUSC-Zxing(十四):混合编码解码分析

2021/12/14 12:44:28

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