基于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的二维码生成
-
ZXing 生成或读取二维码(解决中文乱码的问题)
-
ZXing 生成或读取二维码(解决中文乱码的问题)
-
程序员的乐趣,生成自定义二维码,5行Python代码就搞定
-
基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(v6.9.0版) 博客分类: TableGo java数据库自动生成代码零代码编程软件框架
-
基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(v6.0.0版) 博客分类: TableGo java数据库自动生成代码框架模板
-
基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(v6.6.6版) 博客分类: TableGo java数据库自动生成代码框架模板
-
基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(v6.9.0版) 博客分类: TableGo java数据库自动生成代码零代码编程软件框架
-
基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(v5.8.8版) 博客分类: TableGo javamybaits数据库模板框架
-
java 二维码的生成与解析示例代码