基于qrencode-3.4.4的二维码生成

MFC DEMO程序下载地址点击打开链接

VS版本号:VS2008

/*//
功能:生成QR二维码
参数:
		szText:			二维码内容
		szFileName:		生成二维码的输出路径,路径必须存在
		nWidth			二维码图像宽度
返回:
	 0 - 生成成功
	-1 - QR编码失败
	-2 - 分配内存失败
	-3 - 创建文件失败
*///
long QRGenerate(const char * szText, const char * szFileName, int nWidth)
{
	long lRet= 0;
	QRcode * pQRC = NULL;
	if (pQRC = QRcode_encodeString(szText, 0, QR_ECLEVEL_H, QR_MODE_8, 1))
	{		
		unsigned int	unWidth, x, y, l, n, unWidthAdjusted, unDataBytes;
		unsigned char*	pRGBData, *pSourceData, *pDestData;
		FILE*			f;
		unWidth = pQRC->width;

		int nOutFilePixelPrescaler = nWidth/unWidth;
		
		unWidthAdjusted = unWidth * nOutFilePixelPrescaler * 3;
		if (unWidthAdjusted % 4)
			unWidthAdjusted = (unWidthAdjusted / 4 + 1) * 4;
		unDataBytes = unWidthAdjusted * unWidth * nOutFilePixelPrescaler;

		// Allocate pixels buffer
		if (!(pRGBData = (unsigned char*)malloc(unDataBytes)))
		{
			//printf("Out of memory");
			lRet = -2;
		}
		else
		{
			// Preset to white
			memset(pRGBData, 0xff, unDataBytes);

			// Prepare bmp headers
			BITMAPFILEHEADER kFileHeader;
			kFileHeader.bfType = 0x4d42;  // "BM"
			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 * nOutFilePixelPrescaler;
			kInfoHeader.biHeight = -((int)unWidth * nOutFilePixelPrescaler);
			kInfoHeader.biPlanes = 1;
			kInfoHeader.biBitCount = 24;
			kInfoHeader.biCompression = BI_RGB;
			kInfoHeader.biSizeImage = unDataBytes;
			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 * nOutFilePixelPrescaler;
				for(x = 0; x < unWidth; x++)
				{
					if (*pSourceData & 1)
					{
						for(l = 0; l < nOutFilePixelPrescaler; l++)
						{
							for(n = 0; n < nOutFilePixelPrescaler; n++)
							{
								*(pDestData +		n * 3 + unWidthAdjusted * l) =	PIXEL_COLOR_B;
								*(pDestData + 1 +	n * 3 + unWidthAdjusted * l) =	PIXEL_COLOR_G;
								*(pDestData + 2 +	n * 3 + unWidthAdjusted * l) =	PIXEL_COLOR_R;
							}
						}
					}
					pDestData += 3 * nOutFilePixelPrescaler;
					pSourceData++;
				}
			}

			// Output the bmp file
			if (!(fopen_s(&f, szFileName, "wb")))
			{
				fwrite(&kFileHeader, sizeof(BITMAPFILEHEADER), 1, f);
				fwrite(&kInfoHeader, sizeof(BITMAPINFOHEADER), 1, f);
				fwrite(pRGBData, sizeof(unsigned char), unDataBytes, f);

				fclose(f);
			}
			else
			{
				lRet = -3;
			}
		}

		// Free data
		free(pRGBData);
		QRcode_free(pQRC);		
	}
	else
	{
		lRet = -1;
	}
	return lRet;
}
/*//
功能:生成QR二维码
参数:
szText:			二维码内容
szFileName:		生成二维码的输出路径,路径必须存在
返回:
0 - 生成成功
-1 - QR编码失败
-2 - 分配内存失败
-3 - 创建文件失败
*///
typedef long (*pQrGenerate)(const char * szText, const char * szFileName, int nWidth);

void CQRGeneratorTestDlg::OnBnClickedOk()
{
	// TODO: 在此添加控件通知处理程序代码
	
	HMODULE hDll = LoadLibrary("QRGenerator.dll");
	if (hDll)
	{
		
		pQrGenerate fnQRGenerate = (pQrGenerate)GetProcAddress(hDll, "QRGenerate");
		CString strText;
		CString strFileName = _T("./test.bmp");
		GetDlgItemText(IDC_EDIT1, strText);		
		if (fnQRGenerate)
		{
			long lRet = fnQRGenerate((LPCTSTR)strText, (LPCTSTR)strFileName, 200);
			if (lRet == 0)
			{
				if (m_pic.Load(strFileName))
				{
					m_pic.Draw();
				}
			}
		}
		FreeLibrary(hDll);
	}
}
界面展示效果如下:


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值