libqrencode库编译及使用(libxml库)

1.开源二维码库libqrencode的下载地址

libqrencode是一个日本人写的生成二维码的可以跨平台的c库,官网是这里,Github在这里。

2.平台 Linux下的安装步骤(Ubuntu1204)

tar zxvf qrencode-3.4.2.tar.gz

cd qrencode-3.4.2

./configure

make

make install

安装完成后我们可以发现共享库下会多出

1. /usr/local/include qrencode.h 头文件

2. /usr/local/lib .so 共享库文件

这就是我们开发需要的东西



3.使用方法

1.编写主程序代码--main.cpp

//main.cpp



#include <cstdio>

#include <cstring>

#include <iostream>

#include <cmath>

#include <cstdlib>

#include "qrencode.h"


using namespace std;


typedef unsigned char BYTE;

typedef unsigned short WORD;

typedef unsigned int DWORD;


//位图文件头定义;

typedef struct tagBITMAPFILEHEADER

{

//WORD bfType;//单独读取,结构体中就不定义了

DWORD bfSize; //文件大小

WORD bfReserved1; //保留字

WORD bfReserved2; //保留字

DWORD bfOffBits; //从文件头到实际位图数据的偏移字节数

} BITMAPFILEHEADER;


typedef struct tagBITMAPINFOHEADER

{

DWORD biSize; //信息头大小

DWORD biWidth; //图像宽度

DWORD biHeight; //图像高度

WORD biPlanes; //位平面数,必须为1

WORD biBitCount; //每像素位数

DWORD biCompression; //压缩类型

DWORD biSizeImage; //压缩图像大小字节数

DWORD biXPelsPerMeter; //水平分辨率

DWORD biYPelsPerMeter; //垂直分辨率

DWORD biClrUsed; //位图实际用到的色彩数

DWORD biClrImportant; //本位图中重要的色彩数

} BITMAPINFOHEADER; //位图信息头定义


//像素信息

typedef struct tagIMAGEDATA

{

BYTE blue;

BYTE green;

BYTE red;

} DATA;


int main()

{


const char *QRTEXT = "欢迎来到我的的博客";

QRcode *qrCode;

int version = 5; //设置版本号,这里设为5,对应尺寸:37 * 37

QRecLevel level = QR_ECLEVEL_H;

QRencodeMode hint = QR_MODE_8;

int casesensitive = 1;


qrCode = QRcode_encodeString(QRTEXT, version, level, hint, casesensitive);

if (NULL == qrCode)

{

printf("QRcode create fail\n");

return -1;

}


//将要生成的二维码保存为BMP真彩色图片文件

FILE *pf = fopen("qrcode.bmp", "wb");

if (NULL == pf)

{

printf("file open fail.\n");

fclose(pf);

return -1;

}

int width = qrCode->width;

int height = qrCode->width;

int biCount = 24; //真彩色

int lineByte = (width * biCount / 8 + 3) / 4 * 4; //每line字节数必须为4的倍数

//位图文件头

BITMAPFILEHEADER bitMapFileHeader;

//bitMapFileHeader.bfType = 0x4D42;

bitMapFileHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + lineByte * height;

bitMapFileHeader.bfReserved1 = 0;

bitMapFileHeader.bfReserved2 = 0;

bitMapFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

//位图信息头

BITMAPINFOHEADER bitMapInfoHeader;

bitMapInfoHeader.biBitCount = biCount;

bitMapInfoHeader.biClrImportant = 0;

bitMapInfoHeader.biClrUsed = 0;

bitMapInfoHeader.biCompression = 0;

bitMapInfoHeader.biHeight = height;

bitMapInfoHeader.biPlanes = 1;

bitMapInfoHeader.biSize = 40;

bitMapInfoHeader.biSizeImage = lineByte * height;

bitMapInfoHeader.biWidth = width;

bitMapInfoHeader.biXPelsPerMeter = 0;

bitMapInfoHeader.biYPelsPerMeter = 0;


WORD bfType = 0x4D42;


//BM类型

fwrite(&bfType, sizeof(WORD), 1, pf);

//写文件头进文件

fwrite(&bitMapFileHeader, sizeof(BITMAPFILEHEADER), 1, pf);

//写位图信息头进文件

fwrite(&bitMapInfoHeader, sizeof(BITMAPINFOHEADER), 1, pf);

unsigned char *pBMPData = new unsigned char[lineByte * height];

memset(pBMPData, 255, lineByte * height);


unsigned char *qrData = qrCode->data;

for (int i = 0; i < height; i++)

{

for (int j = 0; j < lineByte / 3; j++)

{

if (*(qrData)&1)

{

//设置rgb颜色,可自定义设置,这里设为黑色。

*(pBMPData + lineByte * i + 3 * j) = 0;

*(pBMPData + lineByte * i + 3 * j + 1) = 0;

*(pBMPData + lineByte * i + 3 * j + 2) = 0;

}

qrData++;

}

}


//写数据进文件

fwrite(pBMPData, sizeof(unsigned char), lineByte * height, pf);

fclose(pf);

delete[] pBMPData;

pBMPData = NULL;


QRcode_free(qrCode);

return 0;

}

2.makefile

# A commonMakefile for c programs, version 1.0

# Copyright (C)2014 shallnew \at 163 \dot com



CC = g++


#CFLAGS += -g -Wall -Werror -O2

CPPFLAGS += -I/usr/local/include

LDFLAGS += -L/usr/local/lib -lqrencode




# SRC_OBJ =$(patsubst %.c, %.o, $(wildcard *.c))

SRC_FILES =$(wildcard *.cpp)

SRC_OBJ =$(SRC_FILES:.cpp=.o)

SRC_BIN =Qrcode


$(SRC_BIN) :$(SRC_OBJ)

$(CC) -o $@ -g $^ $(CPPFLAGS) $(LDFLAGS)

$(RM) $(SRC_OBJ) *~

clean:

$(RM) $(SRC_OBJ) $(SRC_BIN) *~


3.编译运行

问题点: 你可能在编译的时候遇到

这是因为你还没有将Qrencode库文件编写进共享库中

你可以执行一下命令进行解决

echo "/usr/local/lib" >> /etc/ld.so.conf

/sbin/ldconfig

如果过程顺利的话你将看到一个小型的二维码图片

原文链接:,转发请注明来源!