日常生活中到处都有二维码的身影,比如说扫码支付、扫码加好友、扫码查询信息等等。几乎所有的手机APP都支持生成二维码和扫二维码,我们PC端的程序有时也需要支持。为了方便用户的使用,程序生成二维码,用户只需要扫二维码就能打开对应页面,不再需要进行一些复杂的操作。今天我们就来讲述一下如何使用libqr库来生成二维码。
libqr是github上开源的二维码生成库,其github地址为:https://github.com/rsky/qrcode。使用c语言编写,提供了标准的C接口,API使用起来很方便,该库可以输出bitmap和png两种图片格式的二维码。
开源库的作者是一位来自日本的程序员,开源库的头文件中的注释都是使用日语写的,如果要看注释,可以尝试用翻译软件去翻译一下。
使用libqr库生成二维码图片的一般步骤:
1)调用qrInit接口,初始化二维码库;
2)调用qrAddData接口,将要转换成二维码的信息添加到库中;
3)调用qrFinalize接口,发起对二维码的转换;
4)调用qrSymbolToPNG接口,生成二维码图片,qrSymbolToPNG接口会返回图片文件数据buffer;
5)将qrSymbolToPNG返回的图片文件数据保存到文件中,然后显示到UI界面上。
调用libqr库接口生成二维码的详细代码如下:
BOOL CreateAndShowQrCode()
{
int errcode = QR_ERR_NONE;
// 1、初始化libqr库
// qrInit接口的5个参数分别是version、mode、纠错等级、掩码和错误代码,使用过程
// 中使用除了QR_EM_8BIT以外的mode会生成不正常的二维码,暂不知道原因。
QRCode* p = qrInit(2, QR_EM_8BIT, 0, -1, &errcode);
if ( p == NULL )
{
return false;
}
// 2、将要转换成二维码的信息添加到库中
string strData = "https://www.163.com/";
qrAddData( p, (const qr_byte_t*)strData.data(), strData.length() );
// 3、发起对二维码的转换
if (!qrFinalize(p))
{
return false;
}
// 4、生成到png图片数据
int size = 0;
// 两个2分别表示像素之间的距离和二维码图片的放大倍数,范围都是1-16
qr_byte_t * cBuf = qrSymbolToPNG(p, 2, 2, &size);
if (cBuf == NULL)
{
return false;
}
// 5、将png数据保存到文件中
CString strPath = _T("D:\\qrcode.png");
HANDLE hFile;
DWORD dwreturnsize;
hFile = ::CreateFile(strPath, FILE_ALL_ACCESS, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
::WriteFile(hFile, cBuf, size, &dwreturnsize, NULL);
::CloseHandle(hFile);
// 6、将png图片绘制到UI界面上
HBITMAP hBitmap = NULL;
Bitmap btm(strPath);
// 二维码图片显示的宽度和高度
int w,h;
w=h=58;
if( Gdiplus::Ok == btm.GetHBITMAP(NULL,&hBitmap) )
{
CUIString strName = _T("QR_CODE");
// m_pQrCode为UI界面上显示二维码的控件
if( m_pQrCode )
{
m_pm.RemoveImage(strName);
m_pm.AddImage(strName, hBitmap,w,h,false);
m_pQrCode->SetBkImage(strName);
}
}
m_pQrCode->SetBkImage(m_strPath);
return true;
}
如果需要使用libqr开源库去生成二维码,可以到下列地址中去下载编译好的libqr开源库的头文件和库文件:
链接:https://pan.baidu.com/s/1MRVMLz-qb4LU6bofldYJlQ
提取码:7wlt