基于qrencode-3.4.4的二维码生成

xiaoxiao2021-02-28  123

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

转载请注明原文地址: https://www.6miu.com/read-68827.html

最新回复(0)