FAQ TBarCode DLL / TBarCode Library
Come creare un QR Code Structured Append
Come creare un QR Code Structured Append
Esempio: se avete una stringa base64 che volete codificare con più QR Code collegati tra loro, seguite questi passaggi:
- Suddividete la stringa base64 in sottostringhe gestibili. Il limite massimo per la dimensione di una sottostringa è di circa 2.000 caratteri, ma dipende da fattori come le capacità dello scanner, lo spazio disponibile e la risoluzione di stampa. Generate un QR Code separato per ogni sottostringa.
- Impostate l'header Structured-Append in ogni QR Code, specificando il numero totale di codici concatenati, l'indice corrente e il byte di parità. Calcolate il byte di parità sull'intera stringa, non per singolo codice. L'header Structured-Append aiuta lo scanner a determinare quanti QR Code devono essere letti e se i dati sono corretti.
Di seguito una funzione C++ di esempio per salvare un QR Code con un Append Header:
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;
}
Successivamente create i singoli QR Code con gli header Structured Append come mostrato di seguito:
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);
}
Nel codice fornito, un ciclo per calcolare dinamicamente il numero di simboli e scorrere la stringa base64 è omesso per semplicità. Al suo posto vengono usate sottostringhe fisse di 200 caratteri ciascuna, per un totale di 3 simboli nella catena. Assicuratevi di adattarlo secondo necessità.
- Regolate la dimensione del codice a barre o la dimensione di un punto matrice usando i parametri ScaleX e ScaleY nella funzione BCGetOptimalBitmapSize(..).
- BCSaveImage(..) genera un BMP monocromatico. Per un BMP a colori, usate BCSaveImageEx(..) oppure la funzione BitmapToFile(..).
Da notare che il test dei QR Code Structured Append potrebbe richiedere uno scanner in grado di decodificarli correttamente. Alcune app o scanner hardware potrebbero non supportare Structured Append.