编码(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 编码
二进制数据 / 分段 / 高级入口(手动 mask、boostEcl 控制)——分段编码可将数字与文本混合以获得最优压缩。
PNG 输出(xserver 辅助层)
qrcodegen_png 渲染
模块矩阵一步渲染为 1-bit 灰度 PNG:每模块 scale×scale 像素、四边 border 模块静区(规范建议 ≥ 4)。IDAT 经 xrt 的 XDEFLATE_ZLIB 流压缩(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 扩展辅助(非上游内容),依赖宿主 xrt 的 deflate。完整源码见仓库 lib/qrcodegen。