gpt4 book ai didi

java - 在 java 中使用 zxing 扫描多个条码

转载 作者:行者123 更新时间:2023-11-30 11:16:25 29 4
gpt4 key购买 nike

我需要从 tiff 中读取 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 Exception 引起的。在成功扫描的 948 个文件中,218 个 result.length 为 1(它只找到一个条码),68 个 result.length 为 3(但它应该扫描 2 个条码)。

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

最佳答案

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

关于java - 在 java 中使用 zxing 扫描多个条码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24885024/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com