Sample code for 30+ languages & platforms
C Requires Chilkat v11.7.0+

QR Code Error Correction Levels

See more QR Code Examples

Demonstrates the four QR error-correction levels. L, M, Q and H allow a reader to recover the data when about 7%, 15%, 25% and 30% of the symbol is damaged or covered. More error correction leaves less room for data, so the same text needs a larger symbol at a higher level. The default is M. The example also shows boostErrorCorrection, which raises the level for free when the chosen version has room to spare.

Chilkat C Downloads

C
#include <C_CkFormats.h>
#include <C_CkJsonObject.h>
#include <C_CkJsonArray.h>

void ChilkatSample(void)
    {
    BOOL success;
    HCkFormats fmt;
    HCkJsonObject json;
    HCkJsonObject jsonOut;
    HCkJsonArray levels;
    int i;
    HCkJsonObject json2;

    success = FALSE;

    //  This example requires the Chilkat API to have been previously unlocked.
    //  See Global Unlock Sample for sample code.

    fmt = CkFormats_Create();
    json = CkJsonObject_Create();
    jsonOut = CkJsonObject_Create();
    CkJsonObject_UpdateString(json,"payload.text","https://www.chilkatsoft.com/barcode_overview.asp");

    //  Encode the same text at each level.
    levels = CkJsonArray_Create();
    CkJsonArray_Load(levels,"[\"L\",\"M\",\"Q\",\"H\"]");

    for (i = 0; i <= 3; i++) {
        CkJsonObject_UpdateString(json,"encoding.qr.errorCorrection",CkJsonArray_stringAt(levels,i));
        success = CkFormats_QrCode(fmt,"generate",json,jsonOut);
        if (success == FALSE) {
            printf("%s\n",CkFormats_lastErrorText(fmt));
            CkFormats_Dispose(fmt);
            CkJsonObject_Dispose(json);
            CkJsonObject_Dispose(jsonOut);
            CkJsonArray_Dispose(levels);
            return;
        }

        printf("level %s: version %d, %d modules wide\n",CkJsonArray_stringAt(levels,i),CkJsonObject_IntOf(jsonOut,"symbols[0].selectedEncoding.version"),CkJsonObject_IntOf(jsonOut,"symbols[0].dimensions.modulesWide"));
    }

    //  The four symbols.  They hold the same text, and the higher the level, the larger the symbol:

    //  image

    //  A symbol often has room left over.  boostErrorCorrection uses it: the level is raised
    //  as far as the same version allows, so the symbol is no larger but is more robust.
    json2 = CkJsonObject_Create();
    CkJsonObject_UpdateString(json2,"payload.text","https://chilkatsoft.com");
    CkJsonObject_UpdateString(json2,"encoding.qr.errorCorrection","L");
    success = CkFormats_QrCode(fmt,"generate",json2,jsonOut);
    if (success == FALSE) {
        printf("%s\n",CkFormats_lastErrorText(fmt));
        CkFormats_Dispose(fmt);
        CkJsonObject_Dispose(json);
        CkJsonObject_Dispose(jsonOut);
        CkJsonArray_Dispose(levels);
        CkJsonObject_Dispose(json2);
        return;
    }

    printf("level L requested: version %d, level %s\n",CkJsonObject_IntOf(jsonOut,"symbols[0].selectedEncoding.version"),CkJsonObject_stringOf(jsonOut,"symbols[0].selectedEncoding.errorCorrection"));

    CkJsonObject_UpdateBool(json2,"encoding.qr.boostErrorCorrection",TRUE);
    success = CkFormats_QrCode(fmt,"generate",json2,jsonOut);
    if (success == FALSE) {
        printf("%s\n",CkFormats_lastErrorText(fmt));
        CkFormats_Dispose(fmt);
        CkJsonObject_Dispose(json);
        CkJsonObject_Dispose(jsonOut);
        CkJsonArray_Dispose(levels);
        CkJsonObject_Dispose(json2);
        return;
    }

    printf("level L with boost: version %d, level %s\n",CkJsonObject_IntOf(jsonOut,"symbols[0].selectedEncoding.version"),CkJsonObject_stringOf(jsonOut,"symbols[0].selectedEncoding.errorCorrection"));

    //  Level L, and level M reached by the boost.  The two symbols are the same size:

    //  image

    //  Sample output:

    //  level L: version 3, 29 modules wide
    //  level M: version 4, 33 modules wide
    //  level Q: version 5, 37 modules wide
    //  level H: version 6, 41 modules wide
    //  level L requested: version 2, level L
    //  level L with boost: version 2, level M


    CkFormats_Dispose(fmt);
    CkJsonObject_Dispose(json);
    CkJsonObject_Dispose(jsonOut);
    CkJsonArray_Dispose(levels);
    CkJsonObject_Dispose(json2);

    }