一维条形码(UPC、EAN、Code 39、Code 128、ITF、Codabar)是一系列平行的条和空,其宽度编码数字、字母或完整的 ASCII 范围。二维条形码(QR Code、Data Matrix、PDF417、Aztec)则是由模块(单元格)组成的二维图案,排列在静区内,通常在角落有三个定位检测图案用于确定方向。条形码解码是上述过程的逆操作:图像 → 预处理 → 定位符号 → 测量条/空宽度(或采样二维网格) → 查找编码表 → 应用校验和验证结果。
图像处理流程至关重要。源图像先经过灰度转换(亮度 = 0.299R + 0.587G + 0.114B,即 Rec. 601 权重),然后进行全局或自适应阈值处理(Otsu 方法选择使类间方差最大化的阈值,适用于大多数光照良好的扫描图;Sauvola 自适应阈值能更好地处理不均匀光照)。边缘检测(Sobel 核:3×3 的 Gx 和 Gy)找到条的垂直过渡;对这些线进行 Hough 变换可确定方向;连通域分析随后定位符号的边界矩形。在符号被接受为有效候选之前,需要验证静区(符号周围强制性的空白边距,QR Code 为 10 倍 X 尺寸,Code 128 为 9 倍条宽)。
对于一维码,解码器测量 X 尺寸(最窄条的宽度,即单位长度),并以 X 的倍数读取条空宽度。Code 39 的一个字符由 9 条 + 9 空组成(其中一个为字符间间隔);9 个元素中有 3 个是宽的(表示 1),6 个是窄的(表示 0)。Code 128 的一个字符为 11 个模块:起始模式、6 个编码条/空和终止模式。每个字符因此占 11 个模块;11 × 字符数 + 13(起始 + 终止 + 校验 + 静区)即为符号宽度。Code 128 有三种编码集:A(大写 + 控制字符)、B(大写 + 小写)、C(成对数字 00-99)—— 集切换码允许编码器为每个子串选择最高效的编码集。
对于二维码,算法有所不同。QR Code 使用 Reed-Solomon 纠错(EC 等级 L/M/Q/H 分别增加 7%、15%、25%、30% 的冗余)和可配置的掩码模式(8 种之一;编码器选择惩罚分数最低的那个)。掩码处理后,比特流被放置在 21×21(版本 1)到 177×177(版本 40)模块的正方形网格上;角落的三个 7×7 寻找图案和内部角落的 5×5 对齐图案提供方向和比例信息。Data Matrix 使用类似的布局,两侧为 L 形实心边框,另外两侧为交替的明暗图案。PDF417 是一种堆叠线性码(17 个模块宽,最多 90 行),用于美国驾照和航空公司登机牌。
本页面使用 ZXing("Zebra Crossing")库,这是一个开源的 Apache-2.0 多格式解码器,最初来自 Google ZXing 项目。ZXing 运行完整的处理流程(定位 → 预处理 → 解码),并依次尝试每种已知的条码格式。它支持 UPC-A、UPC-E、EAN-8、EAN-13、Code 39、Code 93、Code 128、ITF、Codabar、QR Code、Data Matrix、PDF417 和 Aztec。对于二维码,在良好光照条件下使用 1080p 照片的成功率约为 99%;对于一维码则较低(约 85-95%),因为透视、模糊和反光会扭曲条的宽度。本工具仅支持图片文件输入(上传、拖拽或剪贴板粘贴),不提供摄像头实时扫码功能。
校验和很重要。UPC/EAN 使用单个模 10 校验位(奇数位数字之和 × 3 + 偶数位数字之和,模 10,从 10 中减去)。Code 128 使用模 103 校验字符。Code 39 不要求校验位,但物流领域建议使用模 43 校验。QR Code 使用 Reed-Solomon 纠错;如果纠错解码器发现的错误超出可纠正范围,解码就会失败。当库暴露相关信息时,本页面会在解码失败时显示原因(校验和不匹配、静区太小、掩码冲突等)。
一维条形码(UPC、EAN、Code 39、Code 128、ITF)通过条/空宽度编码数据;二维码(QR Code、Data Matrix、PDF417、Aztec)通过二维模块网格编码。两者都需要约 10 倍单位宽度的静区才能有效识别。图像处理流程:Rec. 601 灰度转换(0.299R + 0.587G + 0.114B)→ Otsu 或 Sauvola 阈值处理 → Sobel 边缘检测 → Hough 变换确定方向 → 连通域分析定位符号边界框。Code 128 有 3 种编码集:A(大写 + 控制字符)、B(大写 + 小写)、C(成对数字 00-99)。集切换码允许编码器为每个子串选择最紧凑的编码集,将 UPC-A "123456789012" 比 Code 39 更紧凑地编码。Code 39:每个字符 9 条 + 9 空,其中 3 个宽(1)、6 个窄(0);起止字符为 "*"。可选模 43 校验位。广泛用于汽车、国防和美国政府领域(MIL-STD-1189)。Code 93 是 Code 128 的前身,每个字符 9 个模块(6 个数据 + 起止),共 47 个唯一字符;在大多数应用中已被 Code 128 取代,但在部分加拿大药房和 USPS 应用中仍然可见。QR Code:L/M/Q/H 等级的 Reed-Solomon 纠错(7%/15%/25%/30% 冗余),8 种掩码模式,21×21 到 177×177 模块(版本 1 到 40)。角落的三个 7×7 寻找图案提供方向信息;较大版本的 5×5 对齐图案校正透视畸变。Data Matrix:两侧为 L 形实心边框,另外两侧为交替明暗图案;用于电子和制药行业的小型物品标记(ISO/IEC 16022)。ZXing("Zebra Crossing",Apache-2.0,Google):本页面使用的开源多格式解码器。支持 UPC-A/E、EAN-8/13、Code 39/93/128、ITF、Codabar、QR Code、Data Matrix、PDF417 和 Aztec。本工具仅支持从图片文件解码(上传、拖拽或剪贴板粘贴),不提供摄像头实时扫码。校验和:UPC/EAN 使用模 10,Code 128 使用模 103,Code 39 使用可选的模 43,QR Code 使用 Reed-Solomon 纠错。校验和不匹配说明图像已损坏,而非数据本身有误。