如何使用 libqr 库生成二维码?
使用 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 库生成二维码?的更多相关文章
- php--------php库生成二维码和有logo的二维码
php生成二维码和带有logo的二维码,上一篇博客讲的是js实现二维码:php--------使用js生成二维码. 今天写的这个小案例是使用php库生成二维码: 效果图: 使用了 php ...
- 使用python调用zxing库生成二维码图片
(1) 安装Jpype 用python调用jar包须要安装jpype扩展,在Ubuntu上能够直接使用apt-get安装jpype扩展 $ sudo apt-get install pytho ...
- 使用Python第三方库生成二维码
本文主要介绍两个可用于生成二维码的Python第三方库:MyQR和qrcode. MyQR的使用: 安装: pip install MyQR 导入: from MyQR import myqr imp ...
- 使用Python的库qrcode生成二维码
现在有很多二维码的生成工具,在线的,或者安装的软件,都可以进行生成二维码.今天我用Python的qrcode库生成二维码.需要预先安装 Image 库 安装 用pip安装 # pip install ...
- ecstore生成二维码
利用phpqrcode库生成二维码: /* *二维码添加 */ ////////////////////////////////////// /*引入文件*/ @include(APP_DIR.'/i ...
- php--------使用js生成二维码
php生成二维码有多种方式,可以在JS中,也可以使用php库,今天写的这个小案例是使用JS生成二维码. 其他方式可以看下一篇文章:php--------php库生成二维码和有logo的二维码 网站开发 ...
- MyQR库自动为网址生成二维码
首先安装MyQR库: pip install MyQR #导包 from MyQR import myqr #生成二维码 words=你要为那个网址生成二维码 save_name=保存后的图片名 pi ...
- android 使用开源库zxing生成二维码,扫描二维码【转】
转自:http://blog.csdn.net/qq_16064871/article/details/52422723 zxing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库 ...
- QRCode.js一个生成二维码的javascript库
前言 最近在开发中遇到一个需求:将后端返回的链接转换成二维码,那么如何来实现呢?我们可以使用QRCode.js来解决这一问题 什么是 QRCode.js? QRCode.js 是一个用于生成二维码的 ...
随机推荐
- 流API--初体验
在JDK8新增的许多功能中,有2个功能最重要,一个是Lambda表达式,一个是流API.Lambda表达式前面我已经整理过了,现在开始整理流API.首先应该如何定义流API中的"流" ...
- 网络编程之TCP编程
网络编程之TCP编程 前面已经介绍过关于TCP协议的东西,这里不做赘述.Java对于基于TCP协议的网络通信提供了良好的封装,Java使用socket对象来代表两端的通信窗口,并通过Socket产生I ...
- Intel DPDK 全面解读
高性能网络技术 随着云计算产业的异军突起,网络技术的不断创新,越来越多的网络设备基础架构逐步向基于通用处理器平台的架构方向融合,从传统的物理网络到虚拟网络,从扁平化的网络结构到基于 SDN 分层的网络 ...
- join on用法
内连接和外连接 内连接用于返回满足连接条件的记录:而外连接则是内连接的扩展,它不仅会满足连接条件的记录,而且还会返回不满足连接条件的记录 内连接 内连接查询返回满足条件的所有记录,默认情况下没有指定任 ...
- Linux服务器删除乱码文件和文件夹的方法
Linux服务器删除乱码文件和文件夹的方法 首页进入乱码文件所在文件夹由于php大势所趋,所以接触Linux服务器的机会越来越多.不同于Windows服务器,Linux服务器只支持数字.英文等字符,对 ...
- rsync命令解释
-v, --verbose 详细模式输出-q, --quiet 精简输出模式-c, --checksum 打开校验开关,强制对文件传输进行校验-a, --archive 归档模式,表示以递归方式传输文 ...
- java web 整合开发王者归来学习总结
第一章java web开发概述 胖客户端CS,瘦客户端BS(Browser) 网址请求---服务器处理响应-----返回结果-----浏览器显示 CGI可以动态生成页面,但是每个进程都要启动一个CGI ...
- AQS 框架之 Unsafe 源码详解
■ 前言 之前 LockSupport那篇已经叙述了是线程阻塞工具类,其底层由 Unsafe 实现,即 park(), unpark() 方法,获取指针偏移量,并操纵内存.本篇主要介绍 Unsafe ...
- 什么是SSL
什么是SSL 简单来说,在我们使用的浏览器中都默认信任着全世界多个最权威的CA机构(证书颁发机构),如下图: 上图中,受信任的根证书颁发机构列表里的都是我们浏览器中默认信任的CA机构,我们只需要向他们 ...
- Java 常用List集合使用场景分析
Java 常用List集合使用场景分析 过年前的最后一篇,本章通过介绍ArrayList,LinkedList,Vector,CopyOnWriteArrayList 底层实现原理和四个集合的区别.让 ...