常见问题 TBarCode DLL / TBarCode Library
如何在 X 轴和 Y 轴使用不同的 DPI 绘制条码?
如何在 X 轴和 Y 轴使用不同的 DPI 绘制条码?
条码生成器库不支持以各向异性分辨率(DPI Y != DPI X)导出位图。每当我们需要创建自己的 DC 时,都会将其创建为“各向同性”的(DPI Y = DPI X)。但下面提供了一些变通方法。
注意:X/Y DPI 的限制仅适用于使用位图函数创建/保存位图,或使用 IgnoreDPIfromDC 绘制的情况。对于绘制到打印机 DC,或从“外部”传入的任意 DC 上使用 BCDraw(..) 或 Draw (gfx) 函数进行绘制,均支持各向异性分辨率。简而言之:只要 DPI 已直接在设备上下文中设置好,且我们只是在给定的 DC 上进行绘制(不涉及我们库中的位图导出),就可以正常工作。
变通方法:
示例——您需要 DPI X = 1200,DPI Y = 600
A)各向异性设备上下文
- 使用 BCDraw (hDC),并使用一个已预设 DPI X = 1200、DPI Y = 600 的设备上下文。
- 使用 Draw(gfx),并使用一个内部 DC 已预设为 DPI X = 1200、DPI Y = 600 的图形对象。
- 要么不调用 BCSetDPI,要么使用 BCSetDPI (pBarcode, -1, -1) ➔ 将库的 DPI 重置为 DC 的默认值。
- 不要设置 BCIgnoreDPIFromDC,因为我们需要从 DC 或图形对象中获取数值。
- 如果您需要将条码图像保存为位图文件,则需要根据内存中绘制的图像,使用您自己的代码来创建该文件。
B)缩放图像
C/C++ 库
先以 1200 x 1200 dpi(各向同性)绘制到位图 DC,然后在 Y 轴方向将图像缩放至 50% = 600 dpi,以获得所需的各向异性结果。
- 您可以以 FAQ 绘制到位图 DC 并缩放到屏幕 DC 中的代码为基础。
- 复制图像时,使用 StretchBlt 而非 BitBlt 来实现 Y 轴的缩放(使用不会产生锯齿或边缘软化的 ROP 和拉伸模式)
- https://learn.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-stretchblt
- https://learn.microsoft.com/en-us/windows/win32/gdi/scaling-an-image - 让 TBarCode 即使在低分辨率屏幕 DC 上也能以高分辨率绘制:
如果您的位图 DC 基于屏幕分辨率(约 96 dpi),但您需要 1200 dpi 或其他分辨率,可以使用 API 函数 BCSetIgnoreDPIFromDC (pBarcode, TRUE)——在 BCDraw 之前设置——并结合 BCSetDPI (pBarCode, 1200, 1200) 使用。这样会通过内部缩放条码绘图坐标来绘制高分辨率位图。请注意此处 DPI X 和 DPI Y 必须相等,且目标位图 DC 必须足够大以容纳完整图像(请注意宽度/高度)。.NET 中类似的 API 函数也支持相同的做法。
如果您需要从内存中的图像生成 BMP/JPG/PNG 文件,则需要使用额外的位图导出代码(互联网上公开提供了免费库和示例代码)。
.NET API
如果您使用我们的 .NET API,可以通过 DrawImage() 函数实现类似 StretchBlt(GDI)的效果。先创建一个“普通”条码位图,然后进行拉伸或更改 DPI——参见示例代码(或搜索更多资料):
C)自定义绘制
使用我们的回调绘制机制。您可以获取所有坐标——以毫米为单位,或以矩阵图案(行图案)形式提供。然后您可以自行决定如何缩放从库中获取的 X 轴和 Y 轴坐标。您从库中获取的坐标分辨率为 1/1000 mm,可以用自己的代码将其转换为像素(并对 X 轴和 Y 轴分别应用自己的 DPI)。之后可绘制到位图 DC(GDI 填充矩形),或使用可为您完成此工作的图形库(例如 .NET)。
自定义绘制示例代码(随 SDK 一同安装):
C:\ProgramData\TEC-IT\TBarCode\11.15\Examples\Visual C++\Custom DrawingC:\ProgramData\TEC-IT\TBarCode\11.15\Examples\Visual Studio .NET\CustomDrawing
更多详情:
- TBarCode11 DLL 开发者手册 - “自定义绘制”一节
- TBarCode Library 自定义绘制(回调)
回调绘制在原生 C/C++ DLL 和 .NET API 中均可使用(参见上方示例)。