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代码下载地址: 点击打开链接


  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
libqrencode是一个C语言编写的,用于生成维条形码。生成的二维码可以通过手机的CCD摄像机轻松扫描出来。该具有很强的鲁棒性,可以生成容量多达7000个数字或4000个字符的二维码。\[1\] 要使用libqrencode生成二维码,你需要以下几个步骤: 1. 下载稳定版本的libqrencode源代码包,可以从http://fukuchi.org/works/qrencode/下载。 2. 解压下载的源代码包,将其中的.h和.c文件拷贝到一个文件夹中,例如命名为libqrencode。 3. 创建一个工程,选择适合你的平台(如OSX或iOS)的应用程序模板。 4. 将libqrencode文件夹中的源代码添加到你的工程中。 5. 根据你的需求,调用libqrencode提供的函数来生成二维码。 这样,你就可以使用libqrencode生成二维码了。请注意,具体的实现细节可能因你的开发环境和需求而有所不同。\[2\]\[3\] #### 引用[.reference_title] - *1* *3* [基于libqrencode二维码生成](https://blog.csdn.net/SkyNullCode/article/details/49934699)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [使用libqrencode生成二维码,支持telphone,短信,url等](https://blog.csdn.net/u013295518/article/details/89680310)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值