使用qrcodegen库可高效实现C++二维码生成,其纯C++、无依赖特性适合简易项目;通过encodeText编码并选择ECC级别,结合stb_image_write可输出PNG图像,控制台打印则便于调试;ECC选型需权衡容错与尺寸,M级为通用场景推荐,默认自动版本选择确保最小尺寸。

要用C++实现一个简易的二维码生成程序,最直接且高效的方式是借助现有的开源库。自己从零开始实现QR码的编码标准,那可真是个大工程,涉及Reed-Solomon纠错码、掩码模式、版本信息等等,对于一个“简易”程序来说,这显然不是我们追求的路径。所以,核心思路就是找到一个合适的C++库,然后学会如何调用它来生成数据矩阵,最后再把这个矩阵渲染出来,无论是输出到控制台,还是生成一张图片。
在我看来,要快速搭建一个C++二维码生成器,
qrcodegen
以下是使用
qrcodegen
获取并包含库文件: 通常,你只需要下载
qrcodegen.hpp
qrcodegen.cpp
#include "qrcodegen.hpp"
核心编码逻辑:
qrcodegen
#include "qrcodegen.hpp" // 假设qrcodegen.hpp在你当前目录
#include <iostream>
#include <string>
#include <vector>
void printQr(const qrcodegen::QrCode &qr) {
int border = 4; // 二维码四周的留白
for (int y = -border; y < qr.getSize() + border; ++y) {
for (int x = -border; x < qr.getSize() + border; ++x) {
// getModule(x, y)返回true表示黑色模块,false表示白色
std::cout << (qr.getModule(x, y) ? "██" : " ");
}
std::cout << std::endl;
}
std::cout << std::endl;
}
int main() {
std::string text_to_encode = "https://www.example.com"; // 你想编码的文本或URL
// 选择错误修正级别:LOW, MEDIUM, QUARTILE, HIGH
qrcodegen::QrCode::Ecc errCorLvl = qrcodegen::QrCode::Ecc::MEDIUM;
try {
// 编码文本,库会自动选择合适的版本
qrcodegen::QrCode qr = qrcodegen::QrCode::encodeText(text_to_encode.c_str(), errCorLvl);
std::cout << "生成的二维码大小: " << qr.getSize() << "x" << qr.getSize() << std::endl;
std::cout << "编码内容: " << text_to_encode << std::endl;
std::cout << "错误修正级别: " << (
errCorLvl == qrcodegen::QrCode::Ecc::LOW ? "L" :
errCorLvl == qrcodegen::QrCode::Ecc::MEDIUM ? "M" :
errCorLvl == qrcodegen::QrCode::Ecc::QUARTILE ? "Q" : "H"
) << std::endl;
printQr(qr); // 打印到控制台
} catch (const qrcodegen::QrCode::DataTooLongException &e) {
std::cerr << "错误:编码的数据太长,无法生成二维码!" << std::endl;
} catch (const std::exception &e) {
std::cerr << "发生未知错误: " << e.what() << std::endl;
}
return 0;
}输出与渲染: 上面示例代码中,我直接用
██
我个人觉得,
qrcodegen
encodeText
encodeBinary
getModule(x, y)
立即学习“C++免费学习笔记(深入)”;
在C++的世界里,生成二维码的库选择其实不算特别多,但有几个是比较成熟和常用的。在我看来,选择哪个库,很大程度上取决于你的项目需求和对集成复杂度的接受程度。
qrcodegen
ZXing
libqrencode
qrcodegen
libqrencode
其他一些包装或绑定: 市面上可能还有一些基于上述库的Python、Qt等框架的C++包装或绑定。这些通常会提供更高级的API,方便与特定框架集成。但对于纯C++项目,直接使用原始库通常更直接。
总的来说,如果你追求极致的简洁和易用性,
qrcodegen
ZXing
libqrencode
qrcodegen
将二维码从控制台的字符画变成一个真正的图像文件,比如PNG或JPG,这在实际应用中是更常见的需求。但C++标准库本身并没有提供图像处理功能,所以我们必须借助第三方库。我的经验是,对于这种简单的图像写入任务,我们不需要引入像OpenCV那样庞大而复杂的库。
传统驾校预约方式步骤繁琐,效率低下,随着移动互联网科技和5G的革新,驾校考试领域迫切需要更加简洁、高效的预约方式,便捷人们的生活。因此设计基于微信小程序的驾校预约系统,改进传统驾校预约方式,实现高效的驾校学校预约。 采用腾讯提供的小程序云开发解决方案,无须服务器和域名。驾校预约管理:开始/截止时间/人数均可灵活设置,可以自定义客户预约填写的数据项驾校预约凭证:支持线下到场后校验签到/核销/二维码自
0
一个非常轻量且易于集成的选择是使用stb_image_write.h
以下是使用
stb_image_write.h
qrcodegen
获取stb_image_write.h
qrcodegen.hpp
.cpp
STB_IMAGE_WRITE_IMPLEMENTATION
准备像素数据: 二维码库(如
qrcodegen
#define STB_IMAGE_WRITE_IMPLEMENTATION // 只需要在一个.cpp文件中定义一次
#include "stb_image_write.h"
#include "qrcodegen.hpp"
#include <vector>
#include <string>
#include <iostream>
// ... (假设qrcodegen::QrCode qr对象已经生成)
void saveQrCodeAsPng(const qrcodegen::QrCode &qr, const std::string &filename, int scale, int border) {
if (scale <= 0 || border < 0) {
std::cerr << "错误: 缩放比例和边框值必须有效。" << std::endl;
return;
}
int qrSize = qr.getSize();
int imageSize = (qrSize + border * 2) * scale; // 图像总尺寸,包含边框和缩放
// 创建一个RGB像素缓冲区,每个像素3个字节 (R, G, B)
// 这里的vector会自动管理内存
std::vector<unsigned char> pixels(imageSize * imageSize * 3);
// 填充像素缓冲区
for (int y = 0; y < imageSize; ++y) {
for (int x = 0; x < imageSize; ++x) {
// 计算当前像素在QR码逻辑上的位置
int qrX = (x / scale) - border;
int qrY = (y / scale) - border;
bool isDark = false;
if (qrX >= 0 && qrX < qrSize && qrY >= 0 && qrY < qrSize) {
isDark = qr.getModule(qrX, qrY);
}
// 否则就是边框区域,默认是白色
unsigned char color = isDark ? 0 : 255; // 0代表黑色,255代表白色
// 设置当前像素的RGB值
pixels[(y * imageSize + x) * 3 + 0] = color; // R
pixels[(y * imageSize + x) * 3 + 1] = color; // G
pixels[(y * imageSize + x) * 3 + 2] = color; // B
}
}
// 使用stb_image_write保存PNG文件
if (stbi_write_png(filename.c_str(), imageSize, imageSize, 3, pixels.data(), imageSize * 3)) {
std::cout << "二维码已成功保存为: " << filename << std::endl;
} else {
std::cerr << "错误: 无法保存PNG文件。" << std::endl;
}
}
int main() {
std::string text_to_encode = "https://www.cppreference.com";
qrcodegen::QrCode::Ecc errCorLvl = qrcodegen::QrCode::Ecc::MEDIUM;
try {
qrcodegen::QrCode qr = qrcodegen::QrCode::encodeText(text_to_encode.c_str(), errCorLvl);
saveQrCodeAsPng(qr, "my_qrcode.png", 10, 4); // 缩放10倍,4个模块的边框
} catch (const std::exception &e) {
std::cerr << "生成二维码或保存文件时出错: " << e.what() << std::endl;
}
return 0;
}这个过程中,
scale
scale=10
border
FreeImage
ImageMagick++
stb_image_write
在生成二维码时,错误修正能力(Error Correction Capability, ECC)和版本(Version)的选择,这其实是一个非常关键的权衡问题,它直接影响到二维码的物理尺寸、数据容量以及在受损情况下的可读性。这并不是随便选一个就行的,得根据实际应用场景来做决策。
错误修正能力(ECC): QR码标准定义了四种错误修正级别:
如何权衡?
版本(Version)选择: QR码有40个版本,从Version 1(21x21模块)到Version 40(177x177模块)。
qrcodegen
我的建议:
以上就是C++如何实现简易二维码生成程序的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号