libqrencode学习笔记(二): 用libqrencode静态库库生成二维码并保存为BMP图片

1 准备

用libqrencode库生成二维码并保存为BMP图片,需要准备:

二维码知识 + libqrencode.lib库或者源码 + BMP文件知识 + VS

二维码编码知识,可自动搜索,网上有很多。

libqrencode.lib库编译生成方法,可参见:《libqrencode学习笔记(一): VS2015编译qrencode-3.4.4》 。

BMP文件知识,可参见:《BMP文件学习笔记(一): C/C++语言实现.bmp文件读写》 和 《BMP文件学习笔记(二):将BMP格式RGB真彩色图片转换成灰度图片》 。
2 编程
代码如下:

    #include <stdio.h>
    #include <Windows.h>
    #include <qrencode.h>
     
    #pragma comment(lib,"libqrencode.lib")
     
    int main()
    {
        const char * QRTEXT = "欢迎来到Jinato的博客";
        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;
        //写文件头进文件
        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;
    }

3 效果
运行后生成的qrcode.bmp文件,因为尺寸只有37*37,所以非常小,用微信或其他二维码扫描工具可描出:欢迎来到Jinato的博客。


DEMO代码下载地址: 点击打开链接

参考文献:

1. http://blog.okbase.net/vchelp/archive/814.html
————————————————
版权声明:本文为CSDN博主「Jinato2016」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ljttianqin/article/details/73823666

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值