Часто задаваемые вопросы: TBarCode DLL / TBarCode Library
Как создать структурированный связанный (Structured Append) QR-код
Как создать структурированный связанный (Structured Append) QR-код
Пример: если у вас есть строка base64, которую вы хотите закодировать несколькими связанными между собой QR-кодами, выполните следующие шаги:
- Разбейте строку base64 на управляемые подстроки. Верхний предел размера подстроки составляет около 2000 символов, но это зависит от таких факторов, как возможности сканера, доступное пространство и разрешение печати. Создайте отдельный QR-код для каждой подстроки.
- Задайте заголовок Structured-Append в каждом QR-коде, указав общее количество связанных кодов, текущий индекс и байт чётности. Рассчитайте байт чётности по всей строке целиком, а не по отдельному коду. Заголовок Structured-Append помогает сканеру определить, сколько QR-кодов нужно считать и корректны ли данные.
Ниже приведён пример функции C++ для сохранения QR-кода с заголовком Append:
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;
}
Далее вы создаёте отдельные QR-коды с заголовками Structured Append, как показано ниже:
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 символа в цепочке. Адаптируйте это по мере необходимости.
- Настройте размер штрихкода или размер точки матрицы с помощью параметров ScaleX и ScaleY в функции BCGetOptimalBitmapSize(..).
- BCSaveImage(..) создаёт монохромный BMP. Для цветного BMP используйте BCSaveImageEx(..) или функцию BitmapToFile(..).
Обратите внимание, что для тестирования структурированных связанных QR-кодов может потребоваться сканер, способный корректно их декодировать. Некоторые приложения или аппаратные сканеры могут не поддерживать Structured Append.