欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基于qrencode-3.4.4的二维码生成

程序员文章站 2024-03-18 19:46:46
...

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);
	}
}
界面展示效果如下:

基于qrencode-3.4.4的二维码生成