我正在编写一个简单的程序,从图像中提取条形码。
我尝试过zxing。效果很好。直到我发现了一些奇怪的东西。
我工作的组织发布表格。相同的表格(我从
的两个地方获得org)具有相同的条形码,我在同一台机器中扫描它们(也相同的结果)到
pdf 格式。
zxing 在第一张图像上做得非常好,并返回了条形码。没有运气
第二张图片..尝试提取条形码时出现 com.google.zxing.NotFoundException
来自第二张图片。更多形式的组织都会出现此问题)。
这是Zxing无法识别的图像。
http://s000.tinyupload.com/?file_id=12080994969485224486
这是他认得的。
http://s000.tinyupload.com/?file_id=30365671784453283753
这是我的代码:
private String handlePdf(File pdfFile) throws Exception {
StringBuilder sb = new StringBuilder();
PDDocument pdDoc = PDDocument.load(pdfFile);
int size = pdDoc.getDocumentCatalog().getAllPages().size();
for (int i = 0; i < size; i++) {
PDPage page = (PDPage) pdDoc.getDocumentCatalog().getAllPages().get(i);
PDResources resources = page.getResources();
Map images = resources.getImages();
if (images != null) {
Iterator<String> imageIter = images.keySet().iterator();
while (imageIter.hasNext()) {
String key = (String) imageIter.next();
PDXObjectImage image = (PDXObjectImage) images.get(key);
String barcode = null ;
barcode = extraceBarcodeFromImage(image.getRGBImage());
if(barcode!= null){
sb.append(barcode);
sb.append(",");
}
}
}
}
return sb.capacity() > 0 ? sb.toString().substring(0, sb.length()-1) :
"no barcode was found";
}
private String extraceBarcodeFromImage(BufferedImage image)
throws NotFoundException {
String finalResult;
if (image == null)
throw new IllegalArgumentException("Could not decode image.");
Map<DecodeHintType, Object> HINTS;
HINTS = new EnumMap(DecodeHintType.class);
HINTS.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);
HINTS.put(DecodeHintType.POSSIBLE_FORMATS,
EnumSet.allOf(BarcodeFormat.class));
Map<DecodeHintType, Object> HINTS_PURE;
HINTS_PURE = new EnumMap<DecodeHintType, Object>(HINTS);
HINTS_PURE.put(DecodeHintType.PURE_BARCODE, Boolean.TRUE);
LuminanceSource source = new BufferedImageLuminanceSource(image);
BinaryBitmap bitmap = new BinaryBitmap(new GlobalHistogramBinarizer(
source));
MultiFormatReader barcodeReader = new MultiFormatReader();
Result result;
result = barcodeReader.decode(bitmap, HINTS_PURE);
finalResult = String.valueOf(result.getText());
return finalResult;
}
感谢您在这种情况下提供的任何帮助。
最佳答案
问题只是图像质量相当低。
在一定的放大倍率下查看工作条形码:
质量不是很好,但也够好了。
现在将其与不起作用的条形码进行比较:
它有些旋转,并且(可能是由于旋转)条形非常有流苏。流苏太多,zxing 无法识别条形码。
我用调试器完成了这个过程,甚至让它查看图像的每一行(不进行操作,它只查看 256 个均匀间隔的行),它没有找到任何可以成功读取为条形的行代码。
因此,您要么必须提高扫描质量(更高的分辨率,确保文档不旋转,...),要么必须寻找一个条形码阅读器库,它不仅仅查看图像列或单独行,而是尝试识别更大的结构。我对这些东西还不够深入,无法推荐任何东西。
关于java - 相同的表格,相同的条形码(128),Zxing仅读取一个条形码(来自2个文档),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18696118/