基于qrencode-3.4.4的二维码生成

来源:互联网 发布:淘宝页面显示有问题 编辑:程序博客网 时间:2024/05/20 12:49

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 intunWidth, 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 bufferif (!(pRGBData = (unsigned char*)malloc(unDataBytes))){//printf("Out of memory");lRet = -2;}else{// Preset to whitememset(pRGBData, 0xff, unDataBytes);// Prepare bmp headersBITMAPFILEHEADER 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 pixelspSourceData = 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 fileif (!(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 datafree(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);}}
界面展示效果如下:


原创粉丝点击