如何用ZXing.NET识别横竖排列条码及重复条码?
条码识别问题
测试场景
BarCode1.jpg
- 包含2个CODE_128条码和2个CODE_39条码
- 识别结果:所有条码均被正确识别
CODE_39[39;210;327;210] : ABC-1234
CODE_128[33;105;319;105] : ABC-abc-1234
CODE_128[424;52;600;52] : 123456787
CODE_39[404;213;628;213] : 123456
BarCode2.jpg
- 包含2个CODE_128条码(1个水平、1个垂直)和2个CODE_39条码(1个水平、1个垂直)
- 识别结果:仅水平条码被正确识别
CODE_39[39;210;327;210] : ABC-1234
CODE_128[33;105;319;105] : ABC-abc-1234
BarCode3.jpg
- 包含2个CODE_128条码(1个水平、1个垂直)和3个CODE_39条码(2个水平、1个垂直)
- 识别结果:仅水平条码被正确识别,重复条码被忽略
CODE_39[39;267;327;267] : ABC-1234
CODE_128[33;133;319;133] : ABC-abc-1234
代码实现
private string ScanBarcode(Bitmap bitmap) { Bitmap target; var reader = new ZXing.Windows.Compatibility.BarcodeReader() { AutoRotate = true, Options = new DecodingOptions { TryHarder = true, PureBarcode = false, ReturnCodabarStartEnd = true, } }; Result[] result = reader.DecodeMultiple(bitmap); if (result==null) return "not found"; string barcodeResult = ""; foreach (var res in result) { barcodeResult += res.BarcodeFormat.ToString() +"[" +res.ResultPoints[0].X +";"+ res.ResultPoints[0].Y +";" +res.ResultPoints[1].X + ";" + res.ResultPoints[1].Y + "]" + " : " + res.Text + "\r\n"; } return barcodeResult; }
使用版本
- ZXing.Windows.Compatibility (0.16.13.0)
- ZXing.net (0.16.10.0)
问题
- 是否有强制识别所有方向条码的配置项?
- 是否有强制识别所有重复条码的配置项?
注:重复条码场景为业务需求,部分表单会重复印刷条码,需要获取所有重复条码的位置信息。
解决方案
1. 识别所有方向条码
ZXing.Net默认对垂直条码的识别支持有限,可通过以下方式优化:
- 确保
AutoRotate = true(已开启),同时在DecodingOptions中通过PossibleFormats明确指定需要识别的条码类型(CODE_128、CODE_39),减少阅读器对方向的过滤。 - 若仍无法识别垂直条码,可手动对图像进行90°、180°、270°旋转后分别解码,再合并结果(如需保留原坐标,需自行转换旋转后的坐标至原图像坐标系)。示例片段:
List<Result> allResults = new List<Result>(); // 原图像解码 var originalResults = reader.DecodeMultiple(bitmap); if (originalResults != null) allResults.AddRange(originalResults); // 旋转90度解码 Bitmap rotated90 = bitmap.RotateFlip(RotateFlipType.Rotate90FlipNone); var rotated90Results = reader.DecodeMultiple(rotated90); if (rotated90Results != null) { // 可选:转换旋转后的坐标至原图像坐标系 foreach(var res in rotated90Results) { // 根据旋转方向调整坐标,例如原图像高度为H,旋转后X=原Y,Y=H-原X } allResults.AddRange(rotated90Results); } // 同理处理180°、270°旋转的图像
2. 识别所有重复条码
ZXing.Net的DecodeMultiple默认会过滤内容重复的条码,可通过以下方式关闭该机制:
- 在
DecodingOptions中设置DuplicateDetection = false,该属性在0.16.x版本已支持,关闭后阅读器会返回所有识别到的条码,包括内容重复的条目。 - 若上述属性无效,可自行实现区域扫描逻辑,遍历图像的不同区域进行解码,避免阅读器自动合并重复结果。
内容的提问来源于stack exchange,提问作者William John Adam Trindade
相关产品推荐
相关产品推荐

