You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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
BarCode1

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
BarCode2

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
BarCode3

代码实现

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. 是否有强制识别所有方向条码的配置项?
  2. 是否有强制识别所有重复条码的配置项?

注:重复条码场景为业务需求,部分表单会重复印刷条码,需要获取所有重复条码的位置信息。


解决方案

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 22:02:02