计算保存Graphics对象所需的图像大小

时间:2009-05-13 09:47:27

标签: c# graphics barcode

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

int reqBarcodeWidth = 100;
int reqBarcodeHeight = 40;

objBitmap = new Bitmap(reqBarcodeWidth, reqBarcodeHeight);

objGraphics = Graphics.FromImage(objBitmap);

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

objGraphics.PageUnit = GraphicsUnit.Inch;

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

提前感谢您的帮助。

更新

感谢您的回复。我之前看过条形码字体,并且真的想要在许多机器上安装字体。

该计划的其中一项功能,我没有提及,将打印没有与之相关的EAN代码的仓库的库存代码。这些通常来自中国,具有复杂的股票代码。这些将需要使用Code 128条形码,它使用扩展的字符范围并占用更少的空间。

硬位主要完成它只是创建我需要整理的图像。我不知道我是不是想以一种复杂的方式做这件事,而不是之前对图像做过任何工作。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

  
    

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

  

位图基于物理设备,其具有通常以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)打开“1.wmf”文件。 (你不能使用MSPaint或Windows预览等...)你会注意到你有一个5x1的蓝色矩形,里面有一个4.5 x 0.5的红色矩形。

这就是你的条形码被绘制到图元文件的方式。用条形码绘图程序替换蓝色和红色矩形代码。不要忘记创建一个透明的大小调整框架来告诉图元文件你的绘图边界。


g.FillRectangle(Brushes.Transparent, rectBounds)

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

嗯,这可能比你想知道的主题更多,但正确是这样做的方式,它会为你节省大量的时间和心痛永远被指责为“无法扫描”...

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