1

我正在为工作编写一个条形码应用程序,我在其中创建一个图形对象并为代码 39 条形码绘制各种条形图。我使用以下代码创建图形对象:

int reqBarcodeWidth = 100;
int reqBarcodeHeight = 40;

objBitmap = new Bitmap(reqBarcodeWidth, reqBarcodeHeight);
            
objGraphics = Graphics.FromImage(objBitmap);

然而,我想做的一件事是允许使用不同的单位来绘制图形对象,例如:

objGraphics.PageUnit = GraphicsUnit.Inch;

但是,如果我这样做,我怎么知道要创建什么大小的位图以适合其上的完整条形码?

提前感谢您的帮助。

更新:

谢谢回复。我以前看过条形码字体,并且真的想取消在许多机器上安装字体。

还有一个我没有提到的程序的功能是打印仓库的库存代码,这些代码没有与之关联的 EAN 代码。这些通常是来自中国的具有复杂库存代码的物品。这些将需要使用 Code 128 条形码,该条形码使用扩展的字符范围并且占用更少的空间。

困难的部分主要是完成它只是创建我需要整理的图像。我不知道我是否想以一种复杂的方式来做这件事,之前并没有真正对图像做过任何工作。

4

2 回答 2

2

你知道存在绘制条形码的字体,所以你可以避免所有这些混乱吗???

于 2009-05-13T12:01:32.310 回答
2

但是,如果我这样做,我怎么知道要创建什么大小的位图以适合其上的完整条形码?

位图基于具有特定分辨率的物理设备,通常以 DPI(每英寸点数)测量。Windows 操作系统为显示器分配 96 或 120 dpi 的逻辑分辨率。打印机的物理分辨率为 300 - 600,有时高达 1200 或更高。处理胶片的照排机可以具有高达 2540 或更高 DPI 的物理分辨率。

逻辑分辨率意味着 X 点在某个设备上等于一英寸。通常这是一个近似值,可用于缩放。物理分辨率表示设备可以实现(或实际存在)X 个每英寸点数。

在制作条形码和打印到设备时,您必须考虑该设备的分辨率。如果您有一个 4 英寸宽的条形码并想在 600 dpi 打印机上打印,您需要一个 4 * 600 = 2400 像素宽的位图。在某些设备上打印还有其他影响,这样您就不会无意中缩小/放大代码条。

我所有漫无边际的要点是,您应该使用矢量格式(例如 .WMF 或 .EMF)生成条形码,然后将其渲染为针对您要输出到的设备量身定制的位图。这也将允许您在 CorelDRAW 或 Adob​​e Illustrator 等矢量绘图程序中编辑代码。

大多数(如果不是全部)条码都有一个宽度公式,它会告诉您在给定特定编码(条码中编码的符号系统)的情况下最终代码的宽度(以英寸为单位)。

有了这些知识,您可以使用类似于以下内容制作条形码(将此 vb.net 代码复制并粘贴到新项目的 form.load 或按钮单击事件中):


Dim gfx As Graphics = Me.CreateGraphics
Dim hdc As IntPtr = gfx.GetHdc()
Dim mf As System.Drawing.Imaging.Metafile = New Imaging.Metafile("c:\1.wmf", hdc, New RectangleF(0, 0, 5 * 2540, 1 * 2540), Imaging.MetafileFrameUnit.GdiCompatible)
Dim g As Graphics = Graphics.FromImage(mf)
g.PageUnit = GraphicsUnit.Inch

g.FillRectangle(Brushes.Blue, New RectangleF(0, 0, 5, 1))
g.FillRectangle(Brushes.Red, New RectangleF(0.25, 0.25, 4.5, 0.5))

g.Dispose()
mf.Dispose()
gfx.ReleaseHdc(hdc)
gfx.Dispose()
  • 图元文件构造函数中的尺寸是英寸 * 2540。2540 是一个常数,表示每英寸 0.01 毫米。这是底层 GDI 使用的。

现在使用 CorelDRAW 或 Illustrator 等真正的矢量图形程序打开“1.wmf”文件。(您不能使用 MSPaint 或 Windows Preview 等...)您会注意到您有一个 5x1 蓝色矩形,中间有一个 4.5 x 0.5 红色矩形。

这就是应如何将您的条形码绘制到元文件中。用您的条形码绘制例程替换蓝色和红色矩形代码。不要忘记创建一个透明的大小框架来告诉元文件你的绘图边界。


g.FillRectangle(Brushes.Transparent, rectBounds)

绘制条形码并将其保存到元文件后,您可以使用 GDI+ 加载它并将其渲染为具有输出设备分辨率的位图。显然,最后一步是将位图发送到您的输出设备,除非您的输出设备当然内置了矢量或 postscript 处理器。

好吧,这可能比您想知道的更多,但这是正确的方法,如果您的代码被指责为“不可扫描”,它将为您节省大量时间和心痛。 .

祝你好运,让我知道结果如何。

于 2009-05-27T21:35:33.090 回答