使用 libqr 库只需 4 步即可生成二维码

1.初始化 QRCode 结构体

QRCode *qrInit(int version, int mode, int eclevel, int masktype, int *errcode);

2.添加数据

int qrAddData(QRCode *qr, const qr_byte_t *source, int size);

3.掩码和数据进行 xor 运算

int qrFinalize(QRCode *qr);

4.构造二维码图像

qr_byte_t *qrSymbolToBMP(QRCode *qr, int sep, int mag, int *size);

qt vs2015 使用 libqr 生成二维码dome

  int errorCode = QR_ERR_NONE;
qr = qrInit(1,QR_EM_8BIT,1,1,&errorCode);//QRCode* qr;
if(qr == NULL)
{
qDebug()<<"errorCode="<<errorCode;
} QString stringData = "cheungxiongwei";
qrAddData(qr,(const qr_byte_t *) stringData.toStdString().data(),stringData.toStdString().length()); if (!qrFinalize(qr))
{
qDebug()<<"errorCode="<<errorCode;
} int size = 0;
qr_byte_t* buffer = qrSymbolToBMP(qr,1,5,&size);
if(buffer == NULL)
{
qDebug()<<"errorCode="<<errorCode;
} qDebug()<<QImage::fromData(buffer,size).format();
ui->QR_Show->setPixmap(QPixmap::fromImage(QImage::fromData(buffer,size)));
ui->QR_Show->setAlignment(Qt::AlignHCenter |Qt::AlignVCenter);

四个函数介绍

1. QRCode *qrInit(int version, int mode, int eclevel, int masktype, int *errcode);

QR_API QRCode *qrInit(int version, int mode, int eclevel, int masktype, int *errcode)
{
//声明一个 QRCode 结构体指针 qr
QRCode *qr = NULL; //申请一个 QRCode 结构体大小的内存,具体可查 calloc 函数
qr = (QRCode *)calloc(1, sizeof(QRCode));
//如果申请失败,则直接返回
if (qr == NULL) {
*errcode = QR_ERR_MEMORY_EXHAUSTED;
return NULL;
}
qr->dataword = (qr_byte_t *)calloc(1, QR_DWD_MAX);
qr->ecword = (qr_byte_t *)calloc(1, QR_ECW_MAX);
qr->codeword = (qr_byte_t *)calloc(1, QR_CWD_MAX);
if (qr->dataword == NULL || qr->ecword == NULL || qr->codeword == NULL) {
*errcode = QR_ERR_MEMORY_EXHAUSTED;
qrDestroy(qr);
return NULL;
} //qr 结构体初始化
qr->_symbol = NULL;
qr->symbol = NULL;
qr->source = NULL;
qr->srcmax = 0;
qr->srclen = 0;
qr->enclen = 0;
qr->delta1 = 0;
qr->delta2 = 0;
qr->errcode = QR_ERR_NONE;
qr->state = QR_STATE_BEGIN; //二维码像素大小(不包括外边框空白) = (version-1)*4 + 21
if (version == -1 || (version >= 1 && version <= QR_VER_MAX)) {
qr->param.version = version;
} else {
*errcode = QR_ERR_INVALID_VERSION;
//销毁指针
qrDestroy(qr);
return NULL;
} //设置编码模式
if (mode == QR_EM_AUTO || (mode >= QR_EM_NUMERIC && mode < QR_EM_COUNT)) {
qr->param.mode = mode;
} else {
*errcode = QR_ERR_INVALID_MODE;
qrDestroy(qr);
return NULL;
} //设置容错等级
if (eclevel >= QR_ECL_L && eclevel < QR_EM_COUNT) {
qr->param.eclevel = eclevel;
} else {
*errcode = QR_ERR_INVALID_ECL;
qrDestroy(qr);
return NULL;
} //设置掩码图案
if (masktype == -1 || (masktype >= 0 && masktype < QR_MPT_MAX)) {
qr->param.masktype = masktype;
} else {
*errcode = QR_ERR_INVALID_MPT;
qrDestroy(qr);
return NULL;
} return qr;
}
//总体来说,这个函数的功能就是初始化一个 QRcode 类型的指针;

2.int qrAddData(QRCode *qr, const qr_byte_t *source, int size);

QR_API int qrAddData(QRCode *qr, const qr_byte_t *source, int size)
{
//判断该结构体是否已经被添加过数据
if (qr->state == QR_STATE_FINAL) {
qrSetErrorInfo(qr, QR_ERR_STATE, _QR_FUNCTION);
return FALSE;
}
return qrAddData2(qr, source, size, qr->param.mode);
} QR_API int qrAddData2(QRCode *qr, const qr_byte_t *source, int size, int mode)
{
int enclen, maxlen;
int version;
int pos, err;
//判断结构体状态
if (qr->state == QR_STATE_FINAL) {
qrSetErrorInfo(qr, QR_ERR_STATE, _QR_FUNCTION);
return FALSE;
}
//如果添加的数据长度为零,则直接返回
if (size <= 0) {
qrSetErrorInfo(qr, QR_ERR_EMPTY_SRC, NULL);
return FALSE;
} //根据设置的编码模式,选择相应的编码写入数据
if (mode == QR_EM_AUTO) {
mode = qrDetectDataType(source, size);
} else if (mode < QR_EM_NUMERIC || mode >= QR_EM_COUNT) {
qrSetErrorInfo(qr, QR_ERR_INVALID_MODE, NULL);
return FALSE;
} //计算编码后的数据长
enclen = qrGetEncodedLength2(qr, size, mode);
if (enclen == -1) {
return FALSE;
}
version = (qr->param.version == -1) ? QR_VER_MAX : qr->param.version;
maxlen = 8 * qr_vertable[version].ecl[qr->param.eclevel].datawords;
if (qr->enclen + enclen > maxlen) {
qrSetErrorInfo3(qr, QR_ERR_LARGE_SRC, ", %d total encoded bits"
" (max %d bits on version=%d, ecl=%s)",
qr->enclen + enclen, maxlen, version, qr_eclname[qr->param.eclevel]);
return FALSE;
}
if (qr->param.version == -1) {
qr->delta1 += qr_vertable[QR_VER_MAX].nlen[mode] - qr_vertable[VERPOINT1].nlen[mode];
qr->delta2 += qr_vertable[QR_VER_MAX].nlen[mode] - qr_vertable[VERPOINT2].nlen[mode];
} /*
* 型号被指定,输入数据直接直接编码
*/
if (qr->param.version != -1) {
qr->enclen += enclen;
if (!qrHasData(qr)) {
qrInitDataWord(qr);
}
//写入数据成功后,改写 qr 结构体的状态为 QR_STATE_SET
if (qrEncodeDataWord(qr, source, size, mode) == TRUE) {
qr->state = QR_STATE_SET;
return TRUE;
}
return FALSE;
} /*
* 验证输入数据
*/
pos = -1;
err = QR_ERR_NONE;
switch (mode) {
case QR_EM_NUMERIC:
pos = qrStrPosNotNumeric(source, size);
err = QR_ERR_NOT_NUMERIC;
break;
case QR_EM_ALNUM:
pos = qrStrPosNotAlnum(source, size);
err = QR_ERR_NOT_ALNUM;
break;
case QR_EM_KANJI:
pos = qrStrPosNotKanji(source, size);
err = QR_ERR_NOT_KANJI;
break;
}
if (pos != -1) {
qrSetErrorInfo3(qr, err, " at offset %d", pos);
return FALSE;
}
qr->enclen += enclen; /*
* 缓冲容量不足的时候,就要追加保存
*/
while (qr->srcmax < qr->srclen + size + 6) {
qr->srcmax += QR_SRC_MAX;
qr->source = (qr_byte_t *)realloc(qr->source, qr->srcmax);
if (qr->source == NULL) {
qr->srcmax = 0;
qrSetErrorInfo2(qr, QR_ERR_MEMORY_EXHAUSTED, _QR_FUNCTION);
return FALSE;
}
} /*
* 在申请的qr结构体中保存数据
*/
qr->source[qr->srclen++] = (qr_byte_t)(mode | 0x80);
qr->source[qr->srclen++] = (qr_byte_t)((size >> 24) & 0x7F);
qr->source[qr->srclen++] = (qr_byte_t)((size >> 16) & 0xFF);
qr->source[qr->srclen++] = (qr_byte_t)((size >> 8) & 0xFF);
qr->source[qr->srclen++] = (qr_byte_t)(size & 0xFF);
memcpy(&(qr->source[qr->srclen]), source, (size_t)size);
qr->srclen += size;
qr->source[qr->srclen] = '\0';
//改写 qr 结构体状态,已经设置过
qr->state = QR_STATE_SET;
return TRUE;
}

3.QR_API int qrFinalize(QRCode *qr);

QR_API int qrFinalize(QRCode *qr)
{
static qr_funcs funcs[] = {
qrFinalizeDataWord,
qrComputeECWord,
qrMakeCodeWord,
qrFillFunctionPattern,
qrFillCodeWord,
qrSelectMaskPattern,
qrFillFormatInfo,
NULL
};
int i = 0;
int ret = TRUE;
//判断 qr->state == QR_STATE_FINAL
if (qrIsFinalized(qr)) {
return TRUE;
} /*
* 码型自动选择
*/
if (qr->param.version == -1) {
int maxlen, delta;
int version = 0;
while (++version <= QR_VER_MAX) {
if (version <= VERPOINT1) {
delta = qr->delta1;
} else if (version <= VERPOINT2) {
delta = qr->delta2;
} else {
delta = 0;
}
maxlen = 8 * qr_vertable[version].ecl[qr->param.eclevel].datawords;
if (maxlen >= qr->enclen - delta) {
break;
}
}
if (version > QR_VER_MAX) {
maxlen = 8 * qr_vertable[QR_VER_MAX].ecl[qr->param.eclevel].datawords;
qrSetErrorInfo3(qr, QR_ERR_LARGE_SRC, ", %d total encoded bits"
" (max %d bits on version=%d, ecl=%s)",
qr->enclen, maxlen, QR_VER_MAX, qr_eclname[qr->param.eclevel]);
return FALSE;
}
qr->param.version = version;
} /*
* データコード語に入力データを登録する
*/
if (qr->source != NULL) {
qr_byte_t *source;
int mode, size; qrInitDataWord(qr);
source = qr->source;
while ((mode = (int)(*source++)) != '\0') {
mode ^= 0x80;
size = ((int)*source++) << 24;
size |= ((int)*source++) << 16;
size |= ((int)*source++) << 8;
size |= (int)*source++;
if (qrEncodeDataWord(qr, source, size, mode) == FALSE) {
return FALSE;
}
source += size;
} qrFree(qr->source);
} /*
* シンボルを生成する
*/
while (funcs[i] && ret == TRUE) {
ret = funcs[i++](qr);
} //掩码设置成功,改写 qr 结构体 为设置完成
if (ret == TRUE) {
qrFree(qr->dataword);
qrFree(qr->ecword);
qrFree(qr->codeword);
qr->state = QR_STATE_FINAL;
}
return ret;
}

4.qr_byte_t *qrSymbolToBMP(QRCode *qr, int sep, int mag, int *size);

QR_API qr_byte_t *qrSymbolToBMP(QRCode *qr, int sep, int mag, int *size)
{
qr_byte_t *rbuf, *rptr;
qr_byte_t *sbuf, *sptr;
int rsize, rmod, imgsize;
int sepskips, pxshift;
int i, j, ix, jx, dim, imgdim, sepdim; QRCNV_CHECK_STATE();
QRCNV_GET_SIZE(); /*
* 変換後のサイズを計算し、メモリを確保する
*/
rsize = (imgdim + 7) / 8;
if ((rmod = (rsize % 4)) != 0) {
rsize += 4 - rmod;
}
imgsize = rsize * imgdim;
*size = QRCNV_BMP_OFFBITS + imgsize;
QRCNV_MALLOC(rsize, *size); /*
* 添加 BMP 图像文件头
*/
sptr = qrBmpWriteHeader(sbuf, *size, imgdim, imgdim, imgsize); /*
* シンボルを書き込む
*/
sepskips = rsize * sepdim;
/* 分離パターン (下) */
if (sepskips) {
memset(sptr, 0, (size_t)sepskips);
sptr += sepskips;
}
for (i = dim - 1; i >= 0; i--) {
memset(rbuf, 0, (size_t)rsize);
pxshift = 7;
rptr = rbuf;
/* 分離パターン (左) */
for (j = 0; j < sepdim; j++) {
qrBmpNextPixel();
}
/* シンボル本体 */
for (j = 0; j < dim; j++) {
if (qrIsBlack(qr, i, j)) {
for (jx = 0; jx < mag; jx++) {
*rptr |= 1 << pxshift;
qrBmpNextPixel();
}
} else {
for (jx = 0; jx < mag; jx++) {
qrBmpNextPixel();
}
}
}
/* 行をmag回繰り返し書き込む */
for (ix = 0; ix < mag; ix++) {
memcpy(sptr, rbuf, (size_t)rsize);
sptr += rsize;
}
}
/* 分離パターン (上) */
if (sepskips) {
memset(sptr, 0, (size_t)sepskips);
sptr += sepskips;
} free(rbuf); return sbuf;
}

5.qr.h 定义文件

/*
* QR Code Generator Library: Basic Header
*
* Core routines were originally written by Junn Ohta.
* Based on qr.c Version 0.1: 2004/4/3 (Public Domain)
*
* @package libqr
* @author Ryusuke SEKIYAMA <rsky0711@gmail.com>
* @copyright 2006-2013 Ryusuke SEKIYAMA
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/ #ifndef _QR_H_
#define _QR_H_ #ifdef __cplusplus
extern "C" {
#endif #include <errno.h>
#include <stdio.h> #if defined(WIN32) && !defined(QR_STATIC_BUILD)
#ifdef QR_DLL_BUILD
#define QR_API __declspec(dllexport)
#else
#define QR_API __declspec(dllimport)
#endif
#else
#define QR_API
#endif /*
* ライブラリのバージョン
*/
#define LIBQR_VERSION "0.3.1" /*
* エラーコード
*/
typedef enum {
/* 汎用エラーコード */
QR_ERR_NONE = 0,
QR_ERR_USAGE = 0x68,
QR_ERR_NOT_IMPL = 0x69,
QR_ERR_SEE_ERRNO = 0x6e,
QR_ERR_FOPEN = 0x6f,
QR_ERR_FREAD = 0x72,
QR_ERR_STATE = 0x73,
QR_ERR_UNKNOWN = 0x75,
QR_ERR_FWRITE = 0x77,
QR_ERR_MEMORY_EXHAUSTED = 0x78, /* パラメータ用エラーコード */
QR_ERR_INVALID_ARG = 0x01,
QR_ERR_INVALID_VERSION = 0x02,
QR_ERR_INVALID_MODE = 0x03,
QR_ERR_INVALID_ECL = 0x04,
QR_ERR_INVALID_MPT = 0x05,
QR_ERR_INVALID_MAG = 0x06,
QR_ERR_INVALID_SEP = 0x07,
QR_ERR_INVALID_SIZE = 0x08,
QR_ERR_INVALID_FMT = 0x09,
QR_ERR_INVALID_OUT = 0x0a,
QR_ERR_INVALID_MAXNUM = 0x0b,
QR_ERR_UNSUPPORTED_FMT = 0x0c,
QR_ERR_EMPTY_PARAM = 0x0f, /* 入力データ用エラーコード */
QR_ERR_EMPTY_SRC = 0x10,
QR_ERR_LARGE_SRC = 0x11,
QR_ERR_NOT_NUMERIC = 0x12,
QR_ERR_NOT_ALNUM = 0x13,
QR_ERR_NOT_KANJI = 0x14, /* 画像処理用エラーコード */
QR_ERR_IMAGE_TOO_LARGE = 0x30,
QR_ERR_WIDTH_TOO_LARGE = 0x31,
QR_ERR_HEIGHT_TOO_LARGE = 0x32,
QR_ERR_IMAGECREATE = 0x33,
QR_ERR_IMAGEFORMAT = 0x34,
QR_ERR_IMAGEFRAME = 0x35, /* zlib用エラーコード */
QR_ERR_DEFLATE = 0x40
} qr_err_t; /*
* 内部状態
*/
#define QR_STATE_BEGIN 0
#define QR_STATE_SET 1
#define QR_STATE_FINAL 2 /*
* 符号化モード
*/
typedef enum {
QR_EM_AUTO = -1, /* 自動選択 */
QR_EM_NUMERIC = 0, /* 数字 */
QR_EM_ALNUM = 1, /* 英数字: 0-9 A-Z SP $%*+-./: */
QR_EM_8BIT = 2, /* 8ビットバイト */
QR_EM_KANJI = 3 /* 漢字 */
} qr_em_t; /* モード総数 */
#define QR_EM_COUNT 4 /*
* 誤り訂正レベル
*/
typedef enum {
QR_ECL_L = 0, /* レベルL */
QR_ECL_M = 1, /* レベルM */
QR_ECL_Q = 2, /* レベルQ */
QR_ECL_H = 3 /* レベルH */
} qr_ecl_t; /* レベル総数 */
#define QR_ECL_COUNT 4 /*
* 出力形式
*/
typedef enum {
QR_FMT_PNG = 0, /* PNG */
QR_FMT_BMP = 1, /* BMP */
QR_FMT_TIFF = 2, /* TIFF */
QR_FMT_PBM = 3, /* PBM */
QR_FMT_SVG = 4, /* SVG */
QR_FMT_JSON = 5, /* JSON */
QR_FMT_DIGIT = 6, /* 文字列 */
QR_FMT_ASCII = 7, /* アスキーアート */
QR_FMT_UNAVAILABLE = -1 /* 利用不可 */
} qr_format_t; /* 出力形式総数 */
#define QR_FMT_COUNT 8 /*
* モジュール値のマスク
*/
#define QR_MM_DATA 0x01 /* 符号化データの黒モジュール */
#define QR_MM_BLACK 0x02 /* 印字される黒モジュール */
#define QR_MM_FUNC 0x04 /* 機能パターン領域(形式/型番情報を含む) */ /*
* 機能パターンの定数
*/
#define QR_DIM_SEP 4 /* 分離パターンの幅 */
#define QR_DIM_FINDER 7 /* 位置検出パターンの1辺の長さ */
#define QR_DIM_ALIGN 5 /* 位置合わせパターンの1辺の長さ */
#define QR_DIM_TIMING 6 /* タイミングパターンのオフセット位置 */ /*
* サイズ定数
*/
#define QR_SRC_MAX 7089 /* 入力データの最大長 */
#define QR_DIM_MAX 177 /* 1辺のモジュール数の最大値 */
#define QR_VER_MAX 40 /* 型番の最大値 */
#define QR_DWD_MAX 2956 /* データコード語の最大長(型番40/レベルL) */
#define QR_ECW_MAX 2430 /* 誤り訂正コード語の最大長(型番40/レベルH) */
#define QR_CWD_MAX 3706 /* コード語の最大長(型番40) */
#define QR_RSD_MAX 123 /* RSブロックデータコード語の最大長 */
#define QR_RSW_MAX 68 /* RSブロック誤り訂正コード語の最大長 */
#define QR_RSB_MAX 2 /* RSブロック種別の最大数 */
#define QR_MPT_MAX 8 /* マスクパターン種別総数 */
#define QR_APL_MAX 7 /* 位置合わせパターン座標の最大数 */
#define QR_FIN_MAX 15 /* 形式情報のビット数 */
#define QR_VIN_MAX 18 /* 型番情報のビット数 */
#define QR_MAG_MAX 16 /* ピクセル表示倍率の最大値 */
#define QR_SEP_MAX 16 /* 分離パターン幅の最大値 */
#define QR_ERR_MAX 1024 /* エラー情報の最大長 */
#define QR_STA_MAX 16 /* 構造的連接(分割/連結)の最大数 */
#define QR_STA_LEN 20 /* 構造的連接ヘッダのビット数 */ /*
* その他の定数
*/
#define NAV 0 /* 不使用(not available) */
#define PADWORD1 0xec /* 埋め草コード語1: 11101100 */
#define PADWORD2 0x11 /* 埋め草コード語2: 00010001 */
#define VERPOINT1 9 /* 文字数指示子のビット数が変わる直前の型番1 */
#define VERPOINT2 26 /* 文字数指示子のビット数が変わる直前の型番2 */ /*
* 8bitバイナリデータ型
*/
typedef unsigned char qr_byte_t; /*
* RSブロックごとの情報
*/
typedef struct qr_rsblock_t {
int rsbnum; /* RSブロック数 */
int totalwords; /* RSブロック総コード語数 */
int datawords; /* RSブロックデータコード語数 */
int ecnum; /* RSブロック誤り訂正数(不使用) */
} qr_rsblock_t; /*
* 誤り訂正レベルごとの情報
*/
typedef struct qr_eclevel_t {
int datawords; /* データコード語数(全RSブロック) */
int capacity[QR_EM_COUNT]; /* 符号化モードごとのデータ容量 */
int nrsb; /* RSブロックの種類(1または2) */
qr_rsblock_t rsb[QR_RSB_MAX]; /* RSブロックごとの情報 */
} qr_eclevel_t; /*
* 型番ごとの情報
*/
typedef struct qr_vertable_t {
int version; /* 型番 */
int dimension; /* 1辺のモジュール数 */
int totalwords; /* 総コード語数 */
int remainedbits; /* 剰余ビット数 */
int nlen[QR_EM_COUNT]; /* 文字数指示子のビット数 */
qr_eclevel_t ecl[QR_ECL_COUNT]; /* 誤り訂正レベルごとの情報 */
int aplnum; /* 位置合わせパターン中心座標数 */
int aploc[QR_APL_MAX]; /* 位置合わせパターン中心座標 */
} qr_vertable_t; /*
* 座標データ型
*/
typedef struct qr_coord_t { int ypos, xpos; } qr_coord_t; /*
* パラメータ構造体
*/
typedef struct qr_param_t {
int version; /* 型番 */
int mode; /* 符号化モード */
int eclevel; /* 誤り訂正レベル */
int masktype; /* マスクパターン種別 */
} qr_param_t; /*
* QRコードオブジェクト
*/
typedef struct qrcode_t {
qr_byte_t *dataword; /* データコード語領域のアドレス */
qr_byte_t *ecword; /* 誤り訂正コード語領域のアドレス */
qr_byte_t *codeword; /* シンボル配置用コード語領域のアドレス */
qr_byte_t *_symbol; /* シンボルデータ領域のアドレス */
qr_byte_t **symbol; /* シンボルデータの各行頭のアドレスのポインタ */
qr_byte_t *source; /* 入力データ領域のアドレス */
size_t srcmax; /* 入力データ領域の最大容量 */
size_t srclen; /* 入力データ領域の使用容量 */
int enclen; /* データコード語の総ビット長 */
int delta1, delta2; /* 型番自動選択の補助に使われるビット長差分 */
int dwpos; /* データコード語の追加バイト位置 */
int dwbit; /* データコード語の追加ビット位置 */
int xpos, ypos; /* モジュールを配置する座標位置 */
int xdir, ydir; /* モジュール配置の移動方向 */
int state; /* 処理の進行状況 */
int errcode; /* 最後に起こったエラーの番号 */
char errinfo[QR_ERR_MAX]; /* 最後に起こったエラーの詳細 */
qr_param_t param; /* 出力パラメータ */
} QRCode; /*
* 構造的連接QRコードオブジェクト
*/
typedef struct qrcode_sa_t {
QRCode *qrs[QR_STA_MAX]; /* QRコードオブジェクトのポインタ配列 */
QRCode *cur; /* 値を入力する対象のQRコードオブジェクト */
int num; /* シンボル数 */
int max; /* 最大シンボル数 */
int parity; /* パリティ */
int state; /* 処理の進行状況 */
qr_param_t param; /* 出力パラメータ */
} QRStructured; /*
* QRコード出力関数型
*/
typedef qr_byte_t *(*QRConverter)(QRCode *, int, int, int *);
typedef qr_byte_t *(*QRsConverter)(QRStructured *, int, int, int, int *); /*
* 基本関数のプロトタイプ
*/
QR_API QRCode *qrInit(int version, int mode, int eclevel, int masktype, int *errcode);
QR_API void qrDestroy(QRCode *qr);
QR_API int qrGetErrorCode(QRCode *qr);
QR_API char *qrGetErrorInfo(QRCode *qr);
QR_API int qrAddData(QRCode *qr, const qr_byte_t *source, int size);
QR_API int qrAddData2(QRCode *qr, const qr_byte_t *source, int size, int mode);
QR_API int qrFinalize(QRCode *qr);
QR_API int qrIsFinalized(const QRCode *qr);
QR_API int qrHasData(const QRCode *qr);
QR_API QRCode *qrClone(const QRCode *qr, int *errcode); /*
* 構造的連接操作用関数のプロトタイプ
*/
QR_API QRStructured *qrsInit(int version, int mode, int eclevel, int masktype, int maxnum, int *errcode);
QR_API void qrsDestroy(QRStructured *st);
QR_API int qrsGetErrorCode(QRStructured *st);
QR_API char *qrsGetErrorInfo(QRStructured *st);
QR_API int qrsAddData(QRStructured *st, const qr_byte_t *source, int size);
QR_API int qrsAddData2(QRStructured *st, const qr_byte_t *source, int size, int mode);
QR_API int qrsFinalize(QRStructured *st);
QR_API int qrsIsFinalized(const QRStructured *st);
QR_API int qrsHasData(const QRStructured *st);
QR_API QRStructured *qrsClone(const QRStructured *st, int *errcode); /*
* 出力用関数のプロトタイプ
*/
QR_API int qrOutputSymbol(QRCode *qr, FILE *fp, int fmt, int sep, int mag);
QR_API int qrOutputSymbol2(QRCode *qr, const char *pathname, int fmt, int sep, int mag);
QR_API qr_byte_t *qrGetSymbol(QRCode *qr, int fmt, int sep, int mag, int *size);
QR_API qr_byte_t *qrSymbolToDigit(QRCode *qr, int sep, int mag, int *size);
QR_API qr_byte_t *qrSymbolToASCII(QRCode *qr, int sep, int mag, int *size);
QR_API qr_byte_t *qrSymbolToJSON(QRCode *qr, int sep, int mag, int *size);
QR_API qr_byte_t *qrSymbolToPBM(QRCode *qr, int sep, int mag, int *size);
QR_API qr_byte_t *qrSymbolToBMP(QRCode *qr, int sep, int mag, int *size);
QR_API qr_byte_t *qrSymbolToSVG(QRCode *qr, int sep, int mag, int *size);
QR_API qr_byte_t *qrSymbolToTIFF(QRCode *qr, int sep, int mag, int *size);
QR_API qr_byte_t *qrSymbolToPNG(QRCode *qr, int sep, int mag, int *size); /*
* 構造的連接出力用関数のプロトタイプ
*/
QR_API int qrsOutputSymbols(QRStructured *st, FILE *fp, int fmt, int sep, int mag, int order);
QR_API int qrsOutputSymbols2(QRStructured *st, const char *pathname, int fmt, int sep, int mag, int order);
QR_API qr_byte_t *qrsGetSymbols(QRStructured *st, int fmt, int sep, int mag, int order, int *size);
QR_API qr_byte_t *qrsSymbolsToDigit(QRStructured *st, int sep, int mag, int order, int *size);
QR_API qr_byte_t *qrsSymbolsToASCII(QRStructured *st, int sep, int mag, int order, int *size);
QR_API qr_byte_t *qrsSymbolsToJSON(QRStructured *st, int sep, int mag, int order, int *size);
QR_API qr_byte_t *qrsSymbolsToPBM(QRStructured *st, int sep, int mag, int order, int *size);
QR_API qr_byte_t *qrsSymbolsToBMP(QRStructured *st, int sep, int mag, int order, int *size);
QR_API qr_byte_t *qrsSymbolsToSVG(QRStructured *st, int sep, int mag, int order, int *size);
QR_API qr_byte_t *qrsSymbolsToTIFF(QRStructured *st, int sep, int mag, int order, int *size);
QR_API qr_byte_t *qrsSymbolsToPNG(QRStructured *st, int sep, int mag, int order, int *size); #ifdef __cplusplus
} // extern "C"
#endif #endif /* _QR_H_ */

最后附上 libqr 库文件

https://files.cnblogs.com/files/cheungxiongwei/libqr.zip

如何使用 libqr 库生成二维码?的更多相关文章

  1. php--------php库生成二维码和有logo的二维码

    php生成二维码和带有logo的二维码,上一篇博客讲的是js实现二维码:php--------使用js生成二维码. 今天写的这个小案例是使用php库生成二维码: 效果图:        使用了 php ...

  2. 使用python调用zxing库生成二维码图片

    (1)     安装Jpype 用python调用jar包须要安装jpype扩展,在Ubuntu上能够直接使用apt-get安装jpype扩展 $ sudo apt-get install pytho ...

  3. 使用Python第三方库生成二维码

    本文主要介绍两个可用于生成二维码的Python第三方库:MyQR和qrcode. MyQR的使用: 安装: pip install MyQR 导入: from MyQR import myqr imp ...

  4. 使用Python的库qrcode生成二维码

    现在有很多二维码的生成工具,在线的,或者安装的软件,都可以进行生成二维码.今天我用Python的qrcode库生成二维码.需要预先安装  Image 库 安装 用pip安装 # pip install ...

  5. ecstore生成二维码

    利用phpqrcode库生成二维码: /* *二维码添加 */ ////////////////////////////////////// /*引入文件*/ @include(APP_DIR.'/i ...

  6. php--------使用js生成二维码

    php生成二维码有多种方式,可以在JS中,也可以使用php库,今天写的这个小案例是使用JS生成二维码. 其他方式可以看下一篇文章:php--------php库生成二维码和有logo的二维码 网站开发 ...

  7. MyQR库自动为网址生成二维码

    首先安装MyQR库: pip install MyQR #导包 from MyQR import myqr #生成二维码 words=你要为那个网址生成二维码 save_name=保存后的图片名 pi ...

  8. android 使用开源库zxing生成二维码,扫描二维码【转】

    转自:http://blog.csdn.net/qq_16064871/article/details/52422723 zxing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库 ...

  9. QRCode.js一个生成二维码的javascript库

    前言 最近在开发中遇到一个需求:将后端返回的链接转换成二维码,那么如何来实现呢?我们可以使用QRCode.js来解决这一问题 什么是 QRCode.js? QRCode.js 是一个用于生成二维码的 ...

随机推荐

  1. python_协程方式操作数据库

    # !/usr/bin/python3 # -*- coding: utf-8 -*- import requests import gevent import pymysql from gevent ...

  2. JavaScript Hoisting

    Hoisting is JavaScript's default behavior of moving all declarations to the top of the current scope ...

  3. k8s 如何 Failover?- 每天5分钟玩转 Docker 容器技术(127)

    上一节我们有 3 个 nginx 副本分别运行在 k8s-node1 和 k8s-node2 上.现在模拟 k8s-node2 故障,关闭该节点. 等待一段时间,Kubernetes 会检查到 k8s ...

  4. pat 1022 digital library

    #include <iostream> #include <sstream> #include <string> #include <vector> # ...

  5. Python之数据结构基础

    一.数据结构基础     a.什么是数据结构          b.数据结构的分类         c.列表           import random from timewrap import ...

  6. html5的video标签自动播放

    概念澄清 这里的"自动播放",是指用户的视觉效果,并不一定是元素自身的自动播放. 查看相关文档后,有以下两种最简方案. 配置属性 发现有video标签有一个自动播放的属性autop ...

  7. java之拦截器Interceptor

    1,拦截器的概念    java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行,同时也提供了 ...

  8. hive权威指南<一>

    一.ETL介绍: 数据抽取:把不同的数据源数据抓取过来,存到某个地方 数据清洗:过滤那些不符合要求的数据或者修正数据之后再进行抽取 不完整的数据:比如数据里一些应该有的信息缺失,需要补全后再写入数据仓 ...

  9. Timer类的schedule和scheduleAtFixedRate 简单应用

    Timer类可以用作定时任务,主要的方法有schedule和scheduleAtFixedRate. schedule(TimerTask task, Date time) 安排在指定的时间执行指定的 ...

  10. 洛谷 [P1280] 尼克的任务

    DP 题目问的是最大空暇时间,那么就定义dp[i]为第i分钟的最大空暇时间,显然满足最优子结构,我们发现dp[i]仅与其后的值有关,那么从后往前推,如果第i分钟没有任务,dp[i]=dp[i+1],如 ...