【问题标题】:Calculate the image size required to hold a Graphics object计算容纳 Graphics 对象所需的图像大小
【发布时间】:2009-05-13 09:47:27
【问题描述】:

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

int reqBarcodeWidth = 100;
int reqBarcodeHeight = 40;

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

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

objGraphics.PageUnit = GraphicsUnit.Inch;

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

提前感谢您的帮助。

更新:

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

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

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

【问题讨论】:

    标签: c# graphics barcode


    【解决方案1】:

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

    【讨论】:

      【解决方案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 等 real 矢量图形程序打开“1.wmf”文件。 (您不能使用 MSPaint 或 Windows Preview 等...)您会注意到您有一个 5x1 蓝色矩形,中间有一个 4.5 x 0.5 红色矩形。

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

      
      g.FillRectangle(Brushes.Transparent, rectBounds)
      

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

      嗯,这可能比你想知道的更多,但这是正确的方法,如果你的代码会为你节省大量时间和心痛曾经被指责为“无法扫描”...

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-19
        • 2012-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多