开源二维码库libqrencode在linux下生产一个BMP二维码图片(实操)

                        开源二维码库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思密达

 

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值