但是,如果我这样做,我怎么知道要创建什么大小的位图以适合其上的完整条形码?
位图基于具有特定分辨率的物理设备,通常以 DPI(每英寸点数)衡量。 Windows 操作系统为显示器分配 96 或 120 dpi 的逻辑分辨率。打印机的物理分辨率为 300 - 600,有时高达 1200 或更高。处理胶片的照排机可以具有高达 2540 或更高 DPI 的物理分辨率。
逻辑分辨率意味着 X 点等于特定设备上的一英寸。通常这是一个近似值,可用于缩放。物理分辨率表示设备可以实现(或实际存在)X 个每英寸点数。
制作条形码并打印到设备时,您必须考虑该设备的分辨率。如果您有一个 4 英寸宽的条码并想在 600 dpi 打印机上打印,您需要一个 4 * 600 = 2400 像素宽的位图。在某些设备上打印还有其他后果,这样您就不会无意中缩小/放大代码栏。
我所有漫无边际的要点是,您应该使用矢量格式(例如 .WMF 或 .EMF)生成条形码,然后将其渲染为针对您要输出到的设备量身定制的位图。这还允许您在 CorelDRAW 或 Adobe 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 等 real 矢量图形程序打开“1.wmf”文件。 (您不能使用 MSPaint 或 Windows Preview 等...)您会注意到您有一个 5x1 蓝色矩形,中间有一个 4.5 x 0.5 红色矩形。
这就是您的条形码应该如何绘制到元文件中。用您的条形码绘制例程替换蓝色和红色矩形代码。不要忘记创建一个透明的大小框架来告诉元文件你的绘图边界。
g.FillRectangle(Brushes.Transparent, rectBounds)
绘制条形码并将其保存到元文件后,您可以使用 GDI+ 加载它并将其渲染为具有输出设备分辨率的位图。显然,最后一步是将位图发送到您的输出设备,当然,除非您的输出设备内置了矢量或 postscript 处理器。
嗯,这可能比你想知道的更多,但这是正确的方法,如果你的代码会为你节省大量时间和心痛曾经被指责为“无法扫描”...
祝你好运,让我知道结果如何。