C#:生成Code 128条形码(条/空间的宽度)

9
我接手了这段代码,或者说,有人开发了它并离开了,现在我们遇到了问题,我正在调查它......我们正在生成c128条形码,但在进行认证时,他们注意到了一个问题,而我却无法解决。 条/空格的宽度为10.5毫米,可接受范围为15-21毫米(1毫米= 0.001英寸)。渲染代码基于此库:http://www.codeproject.com/KB/GDI-plus/GenCode128.aspx,但已进行了一些修改...生成的条形码都是字母数字,没有特殊字符。我认为条+空格的宽度取决于所编码的字符。以下是使用的设置:
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#程序员...

您可以在NuGet中找到GenCode128.dll:https://www.nuget.org/packages/GenCode128/此外,源代码也可以在GitHub上找到:https://github.com/SourceCodeBackup/GenCode128 - Nikolay Kostov
3个回答

15

我完全同意你的观点,只是转换到其中一种可能不像切换 DLL 那么容易... - Brad
你甚至可以使用这样的库来实现MakeBarcodeImage方法 - 这样就不会改变接口,也不需要更改项目的其他部分... - Yahia
经过一些搜索,我很容易发现这段代码基于此:http://www.codeproject.com/KB/GDI-plus/GenCode128.aspx 但有一些更改... - Brad
在您提供的链接中明确指出,它们并不总是符合规范,因为它们不强制执行最小宽度,听起来正是您的问题... - Yahia
你说得对...我将尝试迁移到一个新的库...谢谢! - Brad

7

顺便说一下,这是一个极其糟糕的条形码生成例程,你应该放弃它并搜索专门编写以生成这些条形码的库。

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

从外观上看,您的代码默认使用屏幕设备上下文,其分辨率为96dpi。

必须在最低300dpi、最好600dpi和理想2540dpi的分辨率下生成条形码。

在96dpi下,您永远无法获得所需的准确度。

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

下一个问题是代码使用整数条形码宽度并将其转换为浮点数(哎呀!)。 在处理低dpi(甚至高dpi但不像低dpi那样)时,这会成为问题,因为有些条形码/空格可能需要2个像素,而有些则可能需要3个像素,因此您最终会得到具有不均匀条/空格的条形码。

解决方案2:确保所有应具有相同宽度的条形码/空格具有相同的宽度。

希望可以帮到您。


我必须同意,这是一个糟糕的例程。条形码是二进制的,它应该使用恒定的线宽,并使用来自以下链接的二进制代码:http://en.wikipedia.org/wiki/Code_128 - Martin
谢谢你的建议...我应该看看免费的库并花时间让它工作... - Brad

2
如果您不想使用 Yahia 建议的免费条形码库,我认为增加 “settings.InterCharacterGap” 的值应该可以解决问题。
然而,我认为您应该看一下那些库。这样,您将拥有更少的代码需要维护,可以更轻松地适应您的软件,并且如果所需的条形码类型发生变化,您可能能够立即支持它,而不是重复造轮子。

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