【问题标题】:scanning more than one barcode with zxing in java在java中使用zxing扫描多个条形码
【发布时间】:2014-07-22 10:33:57
【问题描述】:

我需要从 tiffs 读取 pdf417 条码。图片上通常有不止一个条形码-

这是我的代码:

InputStream in = null;
        BufferedImage bfi = null;
        File[] files = new File(DIR).listFiles();

        for (int i = 0; i < files.length; i++) {
            if (files[i].isFile()) {
                try {
                    System.out.println(files[i].getName());
                    in = new FileInputStream(files[i]);
                    bfi = ImageIO.read(in);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    if (in != null) {
                        try {
                            in.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }

                if (bfi != null) {
                    LuminanceSource ls = new BufferedImageLuminanceSource(bfi);
                    BinaryBitmap bmp = new BinaryBitmap(new HybridBinarizer(ls));
                    Reader reader = new MultiFormatReader();
                    Result result = null;

                    Hashtable<DecodeHintType, Object> decodeHints = new Hashtable<DecodeHintType, Object>();
                    decodeHints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);

                    try {
                        result = reader.decode(bmp, decodeHints);
                    } catch (NotFoundException e) {
                        e.printStackTrace();
                    } catch (ChecksumException e) {
                        e.printStackTrace();
                    } catch (FormatException e) {
                        e.printStackTrace();
                    }
                    System.out.println(result.getBarcodeFormat());
                    System.out.println("Text " + result.getText());
                    System.out
                            .println("-------------------------------------------------------");

                } else {
                    System.out.println("No Buffered Image for "
                            + files[i].getName());
                }
            }

        }

这有时有效,但有时无效,结果为空。

我查看了zxing的javadoc,发现了一个GenericMultipleBarcodeReader。 我试图在我的代码中使用 in 但做错了,因为我得到了 NullPointerException:

Reader reader = new MultiFormatReader();
                    GenericMultipleBarcodeReader greader = new GenericMultipleBarcodeReader(reader);
                    Result[] result = null;

                    Hashtable<DecodeHintType, Object> decodeHints = new Hashtable<DecodeHintType, Object>();
                    decodeHints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);

                    try {
                        result = greader.decodeMultiple(bmp, decodeHints);
                    } catch (NotFoundException e) {
                        e.printStackTrace();
                    }

                    for (int j = 0; j < result.length; j++) {
                        System.out.println(result[j].getBarcodeFormat());
                        System.out.println("Text " + result[j].getText());
                    }


Exception in thread "main" java.lang.NullPointerException
    at com.google.zxing.multi.GenericMultipleBarcodeReader.translateResultPoints(GenericMultipleBarcodeReader.java:163)
    at com.google.zxing.multi.GenericMultipleBarcodeReader.doDecodeMultiple(GenericMultipleBarcodeReader.java:96)
    at com.google.zxing.multi.GenericMultipleBarcodeReader.doDecodeMultiple(GenericMultipleBarcodeReader.java:148)
    at com.google.zxing.multi.GenericMultipleBarcodeReader.decodeMultiple(GenericMultipleBarcodeReader.java:65)
    at barcode.ZXingTest.main(ZXingTest.java:77)

所以问题是:使用 GenericMultipleBarcodeReader(或其他类)扫描图像上的多个条形码是否更好,如果是,我必须如何实现?

更新:

for (int i = 0; i < files.length; i++) {
            try (BufferedInputStream bfin = new BufferedInputStream(
                    new FileInputStream(files[i]))) {
                dateiname = files[i].getName();

                bfi = ImageIO.read(bfin);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            if (bfi != null) {
                LuminanceSource ls = new BufferedImageLuminanceSource(bfi);
                BinaryBitmap bmp = new BinaryBitmap(new HybridBinarizer(ls));

                Reader reader = new MultiFormatReader();
                GenericMultipleBarcodeReader greader = new GenericMultipleBarcodeReader(
                        new ByQuadrantReader(reader));
                Result[] result = null;

                Hashtable<DecodeHintType, Object> decodeHints = new Hashtable<DecodeHintType, Object>();
                decodeHints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);

                try {
                    result = greader.decodeMultiple(bmp, decodeHints);
                } catch (NotFoundException e) {
                    e.printStackTrace();
                    System.out.println("No result");
                    System.out.println("+++++++++++++++++++++++++++++++");
                }
                if (result != null) {
                    for (int j = 0; j < result.length; j++) {
                        System.out.println(result[j].getText());
                        System.out.println("+++++++++++++++++++++++++++++++");
                    } 
                }

            } else {
                System.out.println("No Buffered Image for "
                        + files[i].getName());
            }

        }

如果我在没有 ByQuadrantReader 的情况下尝试它,我会得到相同的 NullPointerException。 我这样做的方式,result.length 有时是 1(返回一个字符串),有时我得到一个 NotFoundException。

我希望这不是我看不到的代码中的愚蠢错误......

第二次编辑:

Exception in thread "main" java.lang.NullPointerException
    at com.google.zxing.multi.GenericMultipleBarcodeReader.doDecodeMultiple(GenericMultipleBarcodeReader.java:109)
    at com.google.zxing.multi.GenericMultipleBarcodeReader.doDecodeMultiple(GenericMultipleBarcodeReader.java:148)
    at com.google.zxing.multi.GenericMultipleBarcodeReader.decodeMultiple(GenericMultipleBarcodeReader.java:65)
    at barcode.ZXingTestMulti.main(ZXingTestMulti.java:86)

第三次编辑:

current version of code:

public static void main(final String[] args) {

        BufferedImage bfi = null;
        File[] files = new File(DIR).listFiles();
        int counttiffs = 0;
        String filename = null;
        TreeMap<String, Exception> errormap = new TreeMap<String, Exception>();
        int onebarcode = 0;
        int twobarcodes = 0;
        int threebarcodes = 0;

        for (int i = 0; i < files.length; i++) {
            if (files[i].isFile()) {
                try (BufferedInputStream bfin = new BufferedInputStream(
                        new FileInputStream(files[i]))) {
                    filename = files[i].getName();

                    bfi = ImageIO.read(bfin);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }

                if (bfi != null) {
                    LuminanceSource ls = new BufferedImageLuminanceSource(bfi);
                    BinaryBitmap bmp = new BinaryBitmap(new HybridBinarizer(ls));

                    Reader reader = new MultiFormatReader();
                    GenericMultipleBarcodeReader greader = new GenericMultipleBarcodeReader(
                            reader);
                    Result[] result = null;

                    Hashtable<DecodeHintType, Object> decodeHints = new Hashtable<DecodeHintType, Object>();
                    decodeHints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);

                    try {
                        result = greader.decodeMultiple(bmp, decodeHints);
                    } catch (NotFoundException e) {
                        errormap.put(filename, e);
                    } catch (NullPointerException e) {
                        errormap.put(filename, e);
                    }
                    if (result != null) {
                        switch (result.length) {
                            case 1:
                                onebarcode++;
                                break;
                            case 3:
                                threebarcodes++;
                                break;
                            default:
                                twobarcodes++;

                        }
                        try (BufferedWriter bfwr = new BufferedWriter(
                                new FileWriter(FILE, true))) {
                            bfwr.write(filename + ": number of barcodes found = "
                                    + result.length);
                            bfwr.newLine();
                            for (int j = 0; j < result.length; j++) {
                                bfwr.write(result[j].getText());
                            }
                            bfwr.newLine();
                            bfwr.write("---------------------------------------------------------");
                            bfwr.newLine();
                            counttiffs++;
                        } catch (IOException e) {
                            e.printStackTrace();
                        }

                    }

                }
                else {
                    System.out.println("No Buffered Image for "
                            + files[i].getName());
                }
            }
        }

我正在使用 core 和 javase 的快照 3.1.1。

如你所见,我需要捕捉 NPE:

java.lang.NullPointerException
    at com.google.zxing.multi.GenericMultipleBarcodeReader.translateResultPoints(GenericMultipleBarcodeReader.java:163)
    at com.google.zxing.multi.GenericMultipleBarcodeReader.doDecodeMultiple(GenericMultipleBarcodeReader.java:96)
    at com.google.zxing.multi.GenericMultipleBarcodeReader.doDecodeMultiple(GenericMultipleBarcodeReader.java:148)
    at com.google.zxing.multi.GenericMultipleBarcodeReader.decodeMultiple(GenericMultipleBarcodeReader.java:65)
    at zBarcodes_Test.ZXingTestMulti.main(ZXingTestMulti.java:72)

和第一个一样。在您第一次提交后,我在另一行得到了 NPE,但现在要么我使用了错误的依赖项,要么它再次发生。

另一件事是:我扫描了大约 2.500 个 tiff 文件,每个文件上都有两个 pdf417 条形码,有些有点倾斜,有些质量不完美(意味着有些像素是白色而不是黑色)。我总共收到 1644 个错误,由 NotFoundException 或 NullPointer 异常引起。在成功扫描的 948 个文件中,有 218 个 result.length 为 1(它只找到了一个条形码)和 68 个,result.length 为 3(但它应该扫描了 2 个条形码)。

根据您的经验,当条码不是完全笔直且边缘几乎没有错误,像素没有完美打印时,zxing 有多大意义?

【问题讨论】:

  • NPE 听起来像一个错误。您能否澄清您使用的是哪个版本的代码——意思是,您编译的代码中的第 163 行是什么?
  • 我无法访问它。该方法被自动调用为 GenericMultipleBarcodeReader。
  • 你至少不知道是哪个版本的代码?
  • 你是指哪个版本的zxing?应该是最新的。我大概是三周前下载的。

标签: java zxing


【解决方案1】:

这看起来像是一个错误,我在https://github.com/zxing/zxing/commit/e715fec42a2f8643c8f53c331f7218a1e62b0dc2 中修复了它,您可以通过抓取 3.1.1-SNAPSHOT 来尝试修复吗?

【讨论】:

  • 嗯,不是 100% 确定,但在 pom 中它说:com.google.zxingzxing-parent3.1.1 -SNAPSHOTpom包装>。我不是已经有 3.1.1-Snapshot 了吗?还是您在谈论不同的软件包?
  • 是的,这意味着您正在引用最新的 SNAPSHOT。当然,在我完成之前你不会得到我的修复,但现在我已经提交并发布了一个新的 SNAPSHOT,你应该得到更新。您可能需要强制 Maven 使用 -U 选项检查它
  • 啊,抱歉,我没有看到您现在编写了修复程序!我会尝试并回复你。不过应该是明天吧!非常感谢!
  • 完全相同的行吗?我认为不可能。该行不再取消引用。是不是有点不同?否则,我认为您没有更新。您可以通过删除 ~/.m2/repository/com/google/zxing/ 来确保您没有本地缓存​​的工件。
  • 对,同一问题的另一个实例。我想这就是全部。我刚刚推送了另一个快照。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-05
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多