开源二维码库libqrencode的使用
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
如果过程顺利的话你将看到一个小型的二维码图片
GG思密达