二维码的生成和应用C++

现在越来越多的商店和应用都要扫码进行一些应用,所以扫码一时成为点对点连接和多点登陆的应用,今天看了一个二维码的库,感觉还不错,可以实现二维码的生成,封装的信息格式可以自己封装。

https://github.com/fukuchi/libqrencode 二维码的库的地址,支持cmake编译,编译之后,就可以直接应用了,会遇到一个getopt的错误,在windows平台下,只需把with_tools取消掉即可生成。

生成之后,就可以根据需要内建生成二维码图片的程序了,这里从网上摘抄了一个小例子,还可以凑合用。

void qr_code(std::string _src_str, std::string _dst_bmp_path)
{
		//参数_src_str是待编码的字符串,_dst_bmp_path是编成二维码后生成的bmp路径名,比如 ./my_qrcode.bmp
		const char* szSourceSring = AnsiToUtf8(_src_str.c_str()).c_str();
		unsigned int unWidth, x, y, l, n, unWidthAdjusted, unDataBytes;
		unsigned char* pRGBData, *pSourceData, *pDestData;
		QRcode* pQRC;
		FILE* f;

		if (pQRC = QRcode_encodeString(szSourceSring, 0, QR_ECLEVEL_H, QR_MODE_8, 1))
		{
			unWidth = pQRC->width;
			unWidthAdjusted = unWidth * 8 * 3;
			if (unWidthAdjusted % 4)
				unWidthAdjusted = (unWidthAdjusted / 4 + 1) * 4;
			unDataBytes = unWidthAdjusted * unWidth * 8;
			// Allocate pixels buffer
			if (!(pRGBData = (unsigned char*)malloc(unDataBytes)))
			{
				exit(-1);
			}
			// Preset to white
			memset(pRGBData, 0xff, unDataBytes);
			// Prepare bmp headers
			BITMAPFILEHEADER kFileHeader;
			kFileHeader.bfType = 0x4d42;
			kFileHeader.bfSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+unDataBytes;
			kFileHeader.bfReserved1 = 0;
			kFileHeader.bfReserved2 = 0;
			kFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
			BITMAPINFOHEADER kInfoHeader;
			kInfoHeader.biSize = sizeof(BITMAPINFOHEADER);
			kInfoHeader.biWidth = unWidth * 8;
			kInfoHeader.biHeight = -((int)unWidth * 8);
			kInfoHeader.biPlanes = 1;
			kInfoHeader.biBitCount = 24;
			kInfoHeader.biCompression = BI_RGB;
			kInfoHeader.biSizeImage = 0;
			kInfoHeader.biXPelsPerMeter = 0;
			kInfoHeader.biYPelsPerMeter = 0;
			kInfoHeader.biClrUsed = 0;
			kInfoHeader.biClrImportant = 0;

			// Convert QrCode bits to bmp pixels
			pSourceData = pQRC->data;
			for (y = 0; y < unWidth; y++)
			{
				pDestData = pRGBData + unWidthAdjusted * y * 8;
				for (x = 0; x < unWidth; x++)
				{
					if (*pSourceData & 1)
					{
						for (l = 0; l < 8; l++)
						{
							for (n = 0; n < 8; n++)
							{
								//以下三行是设置三基色,三基色都设置为0x00,则生成的二维码图片就是黑色的了,要什么颜色自己调整
								*(pDestData + n * 3 + unWidthAdjusted * l) = 0x00;
								*(pDestData + 1 + n * 3 + unWidthAdjusted * l) = 0x00;
								*(pDestData + 2 + n * 3 + unWidthAdjusted * l) = 0x00;
							}
						}
					}
					pDestData += 3 * 8;
					pSourceData++;
				}
			}

			// Output the bmp file
			if (!(fopen_s(&f, _dst_bmp_path.c_str(), "wb")))
			{
				fwrite(&kFileHeader, sizeof(BITMAPFILEHEADER), 1, f);
				fwrite(&kInfoHeader, sizeof(BITMAPINFOHEADER), 1, f);
				fwrite(pRGBData, sizeof(unsigned char), unDataBytes, f);
				printf("qrcode has generated in %s\n", _dst_bmp_path.c_str());
				fclose(f);
			}
			else
			{
				printf("Unable to open file");
				exit(-1);
			}
			// Free data
			free(pRGBData);
			QRcode_free(pQRC);
		}
		else
		{
			printf("NULL returned");
			exit(-1);
		}
}

此时可以根据所需,生成相应的二维码了。后面可以用相应的库压缩一下,比如png的库。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值