在java中使用zxing扫描多个条码 [英] scanning more than one barcode with zxing in java

查看:44
本文介绍了在java中使用zxing扫描多个条码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要从 tiff 中读取 pdf417 条码.图像上通常有不止一个条形码-

I need to read pdf417 barcodes from tiffs. There is usually more than one barcode on the image-

这是我的代码:

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());
                }
            }

        }

这有时有效,但有时不起作用,结果为空.

This works sometimes but sometimes it doesn't and the result is null.

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

I looked at the javadoc of zxing and found a GenericMultipleBarcodeReader. I tried to use in in my code but am doing it wrong because I get a 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(或其他类)扫描图像上的多个条形码是否更好,如果是,我必须如何实现?

So the question is: Is it better to use the GenericMultipleBarcodeReader (or some other class) to scan multiple barcodes on an image and if so, how do I have to implement that?

更新:

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.

If I try it without the ByQuadrantReader, I get the same NullPointerException. The way I'm doing it , result.length is sometimes 1 (returning one String) and sometimes I get a NotFoundException.

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

I hope it's not a dumb fault in my code that I don't see...

第二次

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.

I'm using snapshots 3.1.1 of core and javase.

如你所见,我需要抓住一个 NPE:

As you see, I need to catch a 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,但现在要么我使用了错误的依赖项,要么又发生了.

It's the same as the first one. After your first commit, I got a NPE on a different line, but now either I'm using the wrong dependency or it happened again.

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

And the other thing is: I scanned about 2.500 tiff-files, each with two pdf417 barcodes on them, some a little tilted and some not in perfect quality (meaning some pixles are white instead of black). I get a total of 1644 errors, either caused by a NotFoundException or NullPointer Exception. And of the 948 files scanned successfully, with 218 result.length is 1 (and it only found one barcode) and with 68, result.length is 3 (but it scanned 2 barcodes as it should).

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

In your experience, how sensible is zxing when barcodes are not perfetcly straight and have little errors on the edges, where pixles have not been printed perfectly?

推荐答案

这看起来像是一个错误,我在 https://github.com/zxing/zxing/commit/e715fec42a2f8643c8f53c331f7218a1e62b0dc2 你能试试这个修复吗,也许你可以抓住 3.1.1-SNAPSHOT ?

This just looks like a bug, which I fixed in https://github.com/zxing/zxing/commit/e715fec42a2f8643c8f53c331f7218a1e62b0dc2 Can you try the fix perhaps by grabbing 3.1.1-SNAPSHOT?

这篇关于在java中使用zxing扫描多个条码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆