10 функций · QR + PNG · MIT (Nayuki)

Справочник функций qrcodegen

Вкомпилируется вариантом build.bat qrcodegen. Генерация QR-кодов и вывод PNG одним шагом.

Кодирование (4 функции)

qrcodegen_encodeText кодирование

Одношаговое кодирование текста (оптимальный режим выбирается автоматически); вызывающий предоставляет буфер модулей и временный (qrcodegen_BUFFER_LEN_MAX или по calcSegmentBufferSize). Четыре уровня ECC (LOW/MEDIUM/QUARTILE/HIGH); min/maxVersion 0 — автоматически.

bool qrcodegen_encodeText(const char* text, uint8_t tempBuffer[], uint8_t qrcode[], enum qrcodegen_Ecc ecl, enum qrcodegen_Mode minMode, enum qrcodegen_Mode maxMode, int minVersion, int maxVersion, enum qrcodegen_Mask mask, bool boostEcl);

qrcodegen_encodeBinary / encodeSegments / encodeSegmentsAdvanced кодирование

Бинарные данные / сегментированный / расширенный вход (ручная маска, управление boostEcl) — сегментированное кодирование смешивает цифры и текст для оптимального сжатия.

Вывод PNG (слой xs)

qrcodegen_png рендер

Одношаговый вывод матрицы модулей в 1-битный grayscale PNG: scale×scale пикселей на модуль, по border модулей тихой зоны с четырёх сторон (спецификация рекомендует ≥ 4). IDAT сжимается потоком XDEFLATE_ZLIB xrt (заголовок zlib/adler32 от xrt), CRC32 каждого блока локально. Возвращает буфер xrtMalloc (освобождение xrtFree); *pOutSize получает длину; недопустимые параметры возвращают NULL.

unsigned char* qrcodegen_png(const uint8_t qrcode[], int scale, int border, size_t* pOutSize);
Пример · кодирование в PNG
uint8_t aQr[qrcodegen_BUFFER_LEN_MAX];
uint8_t aTemp[qrcodegen_BUFFER_LEN_MAX];
size_t iSize;
unsigned char* pPng;

if ( qrcodegen_encodeText("https://xs.xywhsoft.com",
    aTemp, aQr, qrcodegen_Ecc_MEDIUM,
    qrcodegen_Mode_BYTE, qrcodegen_Mode_BYTE, 0, 0,
    qrcodegen_Mask_AUTO, true) ) {
    pPng = qrcodegen_png(aQr, 4, 4, &iSize);
    /* pPng: байты PNG (357 байт @ 33 модуля + 4 тихая × 4px) */
    xrtFree(pPng);
}

Чтение и определение (4 функции)

qrcodegen_getSize / getModule чтение

Длина стороны матрицы и значение модуля (true=тёмный) — для своих рендереров (SVG, псевдографика терминала, canvas) или прямой записи пиксельных буферов.

int qrcodegen_getSize(const uint8_t qrcode[]); bool qrcodegen_getModule(const uint8_t qrcode[], int x, int y);

qrcodegen_isNumeric / isAlphanumeric / calcSegmentBufferSize определение

Определение режима (числовой/буквенно-цифровой) для решений при сегментированном кодировании; calcSegmentBufferSize считает временный буфер сегмента.

Вверх по течению ноль аллокаций (буферы даёт вызывающий); слой PNG — вспомогательный слой расширения xserver (не из верхнего репозитория), зависит от deflate хоста xrt. Полные исходники — в каталоге lib/qrcodegen репозитория.