如何生成可靠扫描的小型高密度线性条形码?

4
我正在努力将POS系统与我的网站整合。因此,我想要生成条形码。我使用SKU作为数据字段进行编码,格式为XXXXX-XXX-XXX-XXX
X是从0到9的数字,因此经过研究后,我发现Code 128是最好的选择,请纠正我如果我错了。问题在于尺寸,物品标签的尺寸为2' x 3 1/2'英寸,当我使用barbecue生成条形码并调整图像大小后,扫描器无法读取条形码。因此,请您解释一下尺寸约束是什么,可以获得的最小尺寸是多少英寸。

2
"XXXXX-XXX-XXX-XXX"这种格式是固定的吗?Code 128有一个双密度数字模式,可以高效地编码数字字符串。不幸的是,破折号会阻碍这种优化。 - Terry Burton
1
去掉破折号将产生一个条形码,其中包含更少的条和空格,这给了您更大的灵活性。 - Terry Burton
1
如果您的印刷过程具有很高的分辨率,那么通常最好的做法是使条形码占据符号舒适地适合扫描仪视野范围内的最大可能宽度(同时在符号两侧观察一些空白)。 - Terry Burton
1
以下答案提供了有关生成稳健输出的更详细信息:http://stackoverflow.com/a/31814413/2568535 - Terry Burton
1
我会在这个周末准备一个答案。谢谢。 - Terry Burton
显示剩余3条评论
2个回答

9
生产高质量的条形码需要从头到尾准确控制打印过程。在这里,我提供了针对Code 128的具体指导,以及适用于线性条形码的其他指导。
Code 128的通用使用并没有规定大小限制,但特定行业内的Code 128应用确实定义了一些约束条件。对于您的内部目的而言,实际上只有打印机的保真度和扫描仪的功能等实际限制会决定上下限大小。
您应确保数据能够尽可能紧凑地表示在Code 128中,这将减少所需的条和空间元素数量,从而在调整符号大小时提供更大的灵活性。例如,仅使用数字数据将能够有效利用双密度的“Mode C”数字压缩。详见this answer
这就引出了一个问题,您是否可以在扫描符号后,在应用程序中重新添加SKU中的破折号?考虑一下带有破折号和不带破折号的Code 128的不同宽度,看看这会产生什么影响。

Code 128 with dashes

Code 128 without dashes

此外,在符号的两端必须保持至少十倍于X维度(窄条的宽度)的安静区域。

Parts of a Code 128 symbol

安静区域应被视为Code 128符号的一个不可或缺的部分,如上图所示。
线性条码优化的一般指导原则:
对于封闭应用(您完全控制打印和扫描符号的情况),目标是最大限度地增加条码的宽度,同时确保它在扫描仪的视野范围内舒适地适应。
对于涉及多个贸易伙伴拥有自己设备和流程的开放应用(如一般零售或物流),请确保打印的符号的X维度和高度符合相关应用标准定义的最小和最大约束。
在所有情况下,避免使用抗锯齿技术,因为许多扫描仪执行边缘到相似边缘的测量,这需要清晰定义、高对比度的边缘。抗锯齿通常是由于将过小的位图图像进行放大而产生的,但也可能在没有缩放的情况下出现,这是为了改善常规图像中的“锯齿”外观而设计的特征。
确保输出符号的预期X维度是打印机像素大小的整数倍尤为重要。如果未能做到这一点,将导致元素(条和空白)宽度的不稳定性 - 预期具有相同宽度的元素可能会相差一个打印点。这是因为可用X维度的集合仅由每个窄元素的打印点数决定,并且您无法将小数点分配给条。
Code 128(ISO/IEC 15417)的规范对符号生成软件提出了以下要求:

用于在基于像素的打印机上创建条形码的图形软件必须将每个条和空白精确缩放到所使用打印机的像素间距。对于边缘到相似边缘可解码的符号体系(如Code 128),每个符号字符所包含的像素数量必须是符号字符中模块数量的固定和恒定整数倍。

这意味着物理符号尺寸必须根据打印机的点距以量子方式增长。因此,不可能使用每种型号的打印机满足每个应用程序所需的尺寸约束。一个良好对齐的符号不能简单地变得更大或更小,以满足某个名义尺寸或最佳填充所需空间的要求,同时仍然适合输出设备的物理打印特性。
例如,GS1对于在POS、零售、分销或受监管的医疗保健领域中未扫描的贸易物品上的二维符号的一般规范(SST 4)定义了X维度的允许范围为0.380 - 0.495毫米。通过在窄条上打印两个点,可以使用定制的5 dpmm(每毫米点数)打印机满足这一要求,但是使用更常见的8 dpmm打印机完全无法实现,尽管它是一种更高分辨率的设备:三个0.125毫米的点会过小,四个0.125毫米的点会过大。
此外,在栅格化矢量路径描述时,确保原点与设备的点网格正确对齐是至关重要的。这样,您就可以避免由于像素接触而将具有相同宽度的条形码栅格化为不同的宽度,如下图所示,当在不同的X坐标渲染时,相同的线宽度呈现为不同的打印宽度:

Pixel grazing

未能遵循上述建议将导致图像中某些条形变粗,如下所示的印象。

Same symbol with good and bad grid-fitting

最左边的图像代表高分辨率的印象;中间的图像代表相同符号以低分辨率显示(放大以供比例参考),它经过正确的网格适配并且将完美扫描,因为尽管分辨率较低,条-空间模式与最左边的图像完全相同;最右边的图像是相同的低分辨率印象,但在这种情况下经过错误的网格适配,将无法扫描,因为条-空间模式已被损坏。

另外,请注意,当中间的图像被放大时(仅用于演示目的),抗锯齿只应用于文本而不应用于条纹。正如前面提到的,这对于确保解码过程获得准确的符号元素之间距离是至关重要的。

对于某些印刷过程,软件还可能需要通过减小所有条纹的宽度一小固定量来补偿“印刷增长”(由于墨水渗透和其他工艺上的瑕疵),同时保持准确的边到边间距。

ISO/IEC 15417对此后一过程进行了以下描述:

旨在支持各种打印机的通用印刷软件应提供用户调整X尺寸和条宽增长或减少的功能。

减小条形码宽度的使用应仅限于补偿印刷过程中的物理缺陷,如墨水爆裂。根据技术的不同,条形码宽度调整的程度可能需要定期重新校准。减小条形码宽度无法充分补偿由于图像描述未正确对齐和网格适配而导致的像素刮擦。

即使您严格遵循上述所有建议,某些设备和驱动程序可能包含超出常规抗锯齿的高级功能,这些功能可能会破坏打印完美条形码符号的尝试,特别是当光栅化涉及图像缩放时,即使缩放因子为整数:

  • 某些RIP可能会尝试保持线的宽度以确保线艺术具有均匀的“浓重感”,但在这样做时,它们将调整条宽与空白宽度的相对比例。人眼观察条形码时可能难以观察到此效果。可以认为它是一种打印增长现象的变体,但是条的受影响程度受到一定的统一缩放因子的影响,而不是固定的数量。
  • 某些RIP可能会认为区域内的高频率规则线是一种阴影形式,然后尝试保持感知的灰度水平,要么通过在缩放时引入原始宽度的额外线来保持线距,要么通过在区域内完全替换线条为半色调屏幕。
总结一下,当目标设备的分辨率已知时,生成一个实际可达到的、良好网格适配的源条形码图像,并且最好是源图像像素或路径描述直接与设备点对齐,以避免对图像进行所有不必要的处理。无论打印系统(硬件或软件)的任何组件发生变化,都应始终重新验证打印的符号。 这个答案演示了当没有遵循这些过程控制时会发生什么。

2
这个回答对我帮助很大,特别是 x 维度部分。 - Mohd Alomar
感谢您的反馈。 - Terry Burton

0

简短回答是,我会使用免费且开源的“Zint条形码工作室”和“Code 128”符号系统手动生成和检查我网站所需的所有条形码图像。

更广泛的回答是: 有许多条形码和大量软件可用,但出于实际目的,存在一些限制:

  1. 通常要使用通用条形码,而不是一些专业化的东西,如UPC / EAN或其他自己想出的东西。
  2. 您希望能够使用市场上最便宜和最丰富的二手工作马扫描仪,这些扫描仪已经在任何至少有点现代的仓库中提供。类似Honeywell 1250甚至更便宜的东西。否则,为什么要使用线性条形码,当DataMatrix之类的东西在密度、纠错潜力和额外功能方面都无法被任何一个线性条形码超越。
  3. 您希望条形码尽可能傻瓜化,并尽可能抵抗部分扫描或损坏的条形码扫描。
N2 仅支持 Codabar、Code11、Code32、Code93、Code128、EAN/UPC、GS1 Databar 和 I2of5。所有 GS1 相关内容都太新,不能考虑——只有相对较现代的扫描器才支持它们。它还假设特定的数据格式,并且在某些实现和扫描器中,可能会非常烦人。一些中国扫描器型号不支持 Code93,而且通常较为罕见。EAN/UPC 违反 N1 要求。I2of5 编码没有起始/停止符号,违反了 N3 要求。Codabar 和 Code 11 只能编码数字和几个额外的字符,但使用自己的特殊格式将提供额外的保护,以防止一些不相关的条形码,从而在 N3 方面有所帮助。在剩下的代码中,Code39 和 Code128 中后者对损坏的线路具有更高的抵抗力,且总体条码密度显著更高。
这就是为什么我认为 Code128 是最好的线性条形码。对于那些使用早期的糟糕扫描器的情况,简单的 Code39 是一个相当不错的备选项,可以通过一些免费 TrueType 字体轻松生成。

在你决定使用Code128码之后,知道根据ISO 15417标准有3种不同的编码方式取决于所需符号范围是很有用的。128A由于其控制字符而相当无用,但是使用128C本身或将其与128B部分正确混合可以提供更紧凑的条形码(实际上与我上面列出的所有其他条形码相比,它将是最紧凑的条形码)。但与此同时,一些非常差劲的扫描仪可能无法读取混合符号,需要整个条形码为128C(仅数字对)或128B(大小写字母和数字)。因此,尝试不同的软件、稍微玩弄一下并检查结果也很重要。

然后唯一剩下要做的就是确保你有高对比度(最好是白色背景的黑线,某些扫描仪无法读取反色条形码),保留足够的干净空白区域以及打印适当大小的条形码,同时保持所有计算机屏幕、标签和扫描头至少相对清洁。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接