FAQ TBarCode OCX
如何在 VB6 中为 812.8 DPI 创建最佳条码位图(一维码)?
如何在 VB6 中为 812.8 DPI 创建最佳条码位图(一维码)?
方法 1
第一种方法使用了预设(自定义)的模块宽度,设置 DPI,然后计算符号的总宽度。该原理同样适用于其他打印机。
可以使用 OCX 方法 BCWidthHdc2 来计算条码的宽度。如果已设置模块宽度,请为 [in] nWidth 参数使用一个占位数值。如果您以毫米为单位计算宽度,之后请在调用 SaveImage 函数前将其转换为像素。计算高度也有类似的函数——但只有二维条码才需要计算高度。
注意:当您将模块宽度精确设置为 0.3125 毫米或 0.0123 英寸时,即 100% 符合 812.8 dpi 机器的打印栅格。这是推荐值之一。如果您已启用最佳分辨率标志,模块宽度会被调整到打印栅格中下一个(较低的)像素边界,从而实现“优化”。要进行此优化,必须相应设置 dpi。
示例代码:Dim widthPx As Long Dim heightPx As Long Dim heightMM As Double TBarCode111.Dpi = 812.8 TBarCode111.SizeMode = eSizeMode_CustomModuleWidth TBarCode111.ModuleWidth = "312.5" heightPx = 500 heightMM = heightPx * (25.4 / TBarCode111.Dpi) widthPx = TBarCode111.BCWidthHdc2(0, 1000, heightMM * 1000, eMUPixel) TBarCode111.SaveImage "c:\temp\test2.tif", eIMTif, widthPx, heightPx, 812.8, 812.8
方法 2
第二种方法更为简单,不显式设置模块宽度,而是通过传递给 GetOptimalBitmapSize(OCX API)函数的缩放系数来控制模块宽度。如果使用此方法,请不要在 API 中设置自定义模块宽度和/或最佳分辨率。该函数会执行一些额外的(基于 dpi 的)缩放,在调用该函数之前应将 DPI 设为 0 以关闭此缩放。
由于我们已知打印机的 DPI,因此也就知道了像素(打印机点)的尺寸。我们同时知道,一个模块应始终是一个打印机点的整数倍。还需考虑到,通常一个模块的尺寸不应小于 0.190 毫米(但具体取决于条码类型)。之后您只需将 ScaleX = ModuleWidth/PixelSize 系数(= 8、9、10……)传递给 GetOptimalBitmapSize 函数,并将返回值用于 SaveImage 即可。
模块宽度:0.0123 英寸的最佳值在 812.8 dpi 下对应 10 个像素。因此,GetOptimalBitmapSize 函数的缩放系数应为 10。
示例代码:Dim width As Long Dim height As Long width = 1 height = 500 TBarCode111.Dpi = 0 'turn off additional dpi/96 scaling TBarCode111.GetOptimalBitmapSize 10, 10, width, height TBarCode111.SaveImage "c:\temp\test.tif", eIMTif, width, height, 812.8, 812.8