C#:生成代码128条形码(条形/空格宽度)

C#:生成代码128条形码(条形/空格宽度),c#,barcode,code128,C#,Barcode,Code128,所以我继承了这段代码,或者我应该说,有人开发了这段代码并继续前进,现在我们遇到了问题,我正在研究它 我们正在生成c128条形码,经过认证后,他们发现了一个我看不出来的问题。钢筋/空间的宽度为10.5密耳,其可接受范围为15-21密耳(1密耳=0.001英寸) 渲染代码基于此库:但是已经修改了一些 生成的条形码都是字母数字,没有特殊字符。我认为条形+空格的宽度取决于编码的字符 以下是正在使用的设置: settings.Font = new Font ( FontFamily.GenericSans

所以我继承了这段代码,或者我应该说,有人开发了这段代码并继续前进,现在我们遇到了问题,我正在研究它

我们正在生成c128条形码,经过认证后,他们发现了一个我看不出来的问题。钢筋/空间的宽度为10.5密耳,其可接受范围为15-21密耳(1密耳=0.001英寸)

渲染代码基于此库:但是已经修改了一些

生成的条形码都是字母数字,没有特殊字符。我认为条形+空格的宽度取决于编码的字符

以下是正在使用的设置:

settings.Font = new Font ( FontFamily.GenericSansSerif, 12 );
settings.TopMargin = 10
settings.BottomMargin = 10
settings.LeftMargin = 10
settings.RightMargin = 10
settings.BarCodeHeight = 80
settings.DrawText = true
settings.BarCodeToTextGapHeight = 10
settings.InterCharacterGap = 2

如果我猜的话,我想这是因为条码的宽度是基于条码的高度,而不是条码的高度是基于文本和条码的长度。但是我对这个规范不太熟悉(即使在看过之后),我充其量只是一个C#程序员新手……

这不是一个直接的答案,但我强烈建议使用经过良好测试的库来生成条形码。。。获得正确的条形码并不容易,因为有一些陷阱。。。有很多图书馆,有些是商业的,有些是免费的

2个免费的.NET条形码库:



FWIW,这是一个非常糟糕的条形码生成例程,您应该放弃它,搜索专门为生成这些条形码而编写的库

用于制作位图的设备上下文的分辨率是多少

从外观上看,您的代码默认使用屏幕设备上下文,即96dpi

条形码的生成速度至少应为300dpi,最好为600dpi,最好为2540dpi

在96dpi时,您永远无法达到给定精度所需的分辨率

解决方案1:修改代码以使用高分辨率打印机设备上下文,并以该分辨率生成位图。目前,您的代码只是使用任意计算的宽度

下一个问题是,代码使用整数条宽度并强制转换为浮点(yikes!)。在处理低dpi(即使是高dpi,但没有那么多)时,这会成为一个问题,因为某些条/间距可能会占用2个像素,而某些条/间距可能占用3个像素,因此最终导致条码的条/间距不均匀

解决方案2:确保假定为相同宽度的所有条/空间的宽度相同


HTH

如果你不想像Yahia建议的那样使用免费的条形码库,我认为增加:settings.InterCharacterGap的值就可以了


然而,我认为你应该看看那些图书馆。这样一来,您需要维护的代码就更少了,可以更轻松地调整您的软件,如果条形码类型需要更改,您可以立即支持它,而不是重新发明轮子。

我完全同意您的看法,只是切换到其中一个可能不像切换DLL那么容易…您甚至可以使用这样的库来实现
MakeBarcodeImage
方法-这样就没有界面更改,项目的其他部分也不需要更改…在进行一些搜索之后,我可以很容易地看出这段代码是基于这样的:但是有一些变化…在您提供的链接中,它明确指出它们并不总是符合规范,因为它们没有强制执行最小宽度,听起来就像您的问题一样…您是对的。。。我将尝试迁移到一个新的库。。。谢谢我不得不同意,这是一个糟糕的惯例。条形码是二进制的,它应该使用一个恒定的线宽度和二进制代码来自:谢谢你的建议。。。我可能应该看看一个免费的库,花点时间让它工作……你可以在NuGet中找到
GenCode128.dll
:也可以在GitHub中找到源代码: