常见问题 TBarCode DLL / TBarCode Library
如何创建结构化拼接(Structured Append)二维码
如何创建结构化拼接(Structured Append)二维码
示例:如果您有一个 base64 字符串,需要将其编码为多个相互链接的二维码,请按以下步骤操作:
- 将 base64 字符串拆分为可管理的子字符串。子字符串大小的上限约为 2000 个字符,但具体取决于扫描器能力、可用空间和打印分辨率等因素。为每个子字符串生成一个单独的二维码。
- 在每个二维码中设置结构化拼接头部,指明串联码的总数、当前索引以及奇偶校验字节。奇偶校验字节需针对整个字符串计算,而非针对单个二维码。结构化拼接头部可帮助扫描器确定需要读取多少个二维码,以及数据是否正确。
以下是一个用于保存带拼接头部二维码的 C++ 函数示例:
ERRCODE SaveStructAppendQRCode(LPCSTR path, LPCSTR dataStr, int dataLen, int count, int index, BYTE parity)
{
ERRCODE eCode = ErrOk;
t_BarCode* pBarCode = NULL; // barcode handle
double const dpi = 300;
RECT rect = { 0,0,255,255 };
if (eCode == ErrOk)
eCode = BCAlloc(&pBarCode);
if (eCode == ErrOk)
eCode = BCSetBCType(pBarCode, eBC_QRCode);
if (eCode == ErrOk)
eCode = BCSet_QR_Append(pBarCode, count, index, parity);
if (eCode == ErrOk)
eCode = BCSetTextA(pBarCode, dataStr, dataLen);
if (eCode == ErrOk)
eCode = BCCreate(pBarCode);
if (eCode == ErrOk)
eCode = BCSetDPI(pBarCode, dpi, dpi);
if (eCode == ErrOk)
eCode = BCSetIgnoreDpiFromDC(pBarCode, TRUE);
if (eCode == ErrOk)
eCode = BCSetSizeMode(pBarCode, e_SizeMode::eSizeMode_FitToBoundingRect);
if (eCode == ErrOk)
eCode = BCGetOptimalBitmapSize(pBarCode, &rect, 3, 3);
if (eCode == ErrOk)
eCode = BCSaveImageA(pBarCode, path, eIMBmp, rect.right, rect.bottom, dpi, dpi);
// use BCSaveImageEx for color bitmap
if(pBarCode)
BCFree(pBarCode);
return eCode;
}
接下来,如下所示,为每个子字符串创建带结构化拼接头部的独立二维码:
ERRCODE eCode = ErrOk;
const char* base64Str = "Your base64 string goes here...";
int base64Len = strlen(base64Str);
if (base64Len > 400)
{
BYTE parity = BCCalcStructApp_ParityA(base64Str, base64Len);
if (eCode == ErrOk)
eCode = SaveStructAppendQRCode("c:\\temp\\qrcode_3-1.bmp", &base64Str[0], 200, 3, 1, parity);
if (eCode == ErrOk)
eCode = SaveStructAppendQRCode("c:\\temp\\qrcode_3-2.bmp", &base64Str[200], 200, 3, 2, parity);
if (eCode == ErrOk)
eCode = SaveStructAppendQRCode("c:\\temp\\qrcode_3-3.bmp", &base64Str[400], base64Len - 400, 3, 3, parity);
}
if (eCode != ErrOk)
{
char szErr[255];
BCGetErrorText(eCode, szErr, 255);
printf(szErr);
}
为简化说明,代码示例中省略了动态计算符号数量并遍历 base64 字符串的循环。此示例中固定使用每段 200 个字符的子字符串,总共 3 个符号组成一条拼接链。请根据实际需要进行调整。
- 通过 BCGetOptimalBitmapSize(..) 函数中的 ScaleX 和 ScaleY 参数调整条码大小或矩阵点的大小。
- BCSaveImage(..) 会生成单色 BMP。若需要彩色 BMP,请使用 BCSaveImageEx(..) 或 BitmapToFile(..) 函数。
请注意,测试结构化拼接二维码可能需要一台能够正确解码此类码的扫描器。部分应用或硬件扫描器可能不支持结构化拼接功能。