参考博客:
二维码生成原理及解析代码
生成二维码的库(二选一)
- QR-Code-generator:代码单一,需要支持C++11。如果想移植不支持C++11的环境,修改相对简单。使用可参考C++/QT生成二维码和扫瞄二维码
- libqrencode:源代码结构相对复杂一点,windows下编译可参考C/C++二维码生成库qrencode的使用。不过本人建议直接拷贝源码加入到工程更舒适。
HDC绘画二维码
using qrcodegen::QrCode;
void DrawQRCode(HDC hdc,RECT rtClient)
{
const char *text = "https://blog.youkuaiyun.com/cair2/category_2930179.html";
const QrCode::Ecc errCorLvl = QrCode::Ecc::HIGH;
//如果text包含中文请转换成utf-8
QrCode qr = QrCode::encodeText(text, errCorLvl);
FillRect(hdc, &rtClient, (HBRUSH)GetStockObject(BLACK_BRUSH));
HDC hMemDc = CreateCompatibleDC(hdc);
HBITMAP hMemBitMap = CreateCompatibleBitmap(hdc, qr.getSize(), qr.getSize());
SelectObject(hMemDc, hMemBitMap);
RECT rt = { 0, 0, qr.getSize(), qr.getSize() };
FillRect(hMemDc, &rt, (HBRUSH)GetStockObject(WHITE_BRUSH));
for (int y = 0; y < qr.getSize(); y++)
{
for (int x = 0; x < qr.getSize(); x++)
{
if (qr.getModule(x, y) == 0)
{
SetPixel(hMemDc,x, y, RGB(255, 255, 255));
}
else
{
SetPixel(hMemDc,x, y, RGB(0, 0, 0));
}
}
}
StretchBlt(hdc, 100, 10, 400, 400, hMemDc, 0, 0, qr.getSize(), qr.getSize(), SRCCOPY);
DeleteDC(hMemDc);
DeleteObject(hMemBitMap);
}
生成二维码图片并保存本地
HBITMAP to file
:C++保存HBITMAP为位图文件的实现方法- 使用
libqrencode
:C/C++二维码生成库qrencode的使用
NOTE
如果encodeText的内容包括中文,请转换成utf-8编码之后生成二维码,否则内容不对