1.开源二维码库libqrencode的下载地址
libqrencode是一个日本人写的生成二维码的能够跨平台的c库,官网是这里,Github在这里。html
tar zxvf qrencode-3.4.2.tar.gz cd qrencode-3.4.2 ./configure make make install
安装完成后咱们能够发现共享库下会多出 ios
1. /usr/local/include qrencode.h 头文件git
2. /usr/local/lib .so 共享库文件github
这就是咱们开发须要的东西bash
1.编写主程序代码--main.cppide
//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.makefilespa
# 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.编译运行code
问题点: 你可能在编译的时候遇到htm
这是由于你尚未将Qrencode库文件编写进共享库中blog
你能够执行一下命令进行解决
echo "/usr/local/lib" >> /etc/ld.so.conf /sbin/ldconfig
若是过程顺利的话你将看到一个小型的二维码图片
GG思密达