使用Qt绘制二维码 QRcode

8 篇文章 4 订阅

——今天的我们,是站在巨人的肩膀上前行。

 

二维码自从出现以来,已经极大地改变了我们的生活方式,它能容纳一些简短的信息,却又不那么简短,以至于很多场合都能使用二维码作为信息的载体。一个月以前,有个老师跟我提过一句,如果可以在上机实验时使用二维码来绑定学生的信息,就可以省很多时间。于是我就萌生了使用Qt绘制二维码的想法。

但是这一个月来我一直在研究另一个东西,直到昨天我才研究出一点进展。那个做好之后我就开始研究如何使用Qt生成二维码,发现二维码是有不同标准的,比如在二维码符号表示技术研究方面已研制出多种码制,常见的有PDF417、QR Code、Code 49、Code 16K、Code One等。常用的二维码相关的库也有很多zbar、zxing、libqrencode等。

这次我选用了Github上的 Nayuki 大神所写的QRcode库c++版本,放入Qt中,实现了承载指定信息的二维码的绘制功能。下面是一些总结。

一、QR Code码

QR Code码,是由Denso公司于1994年9月研制的一种矩阵二维码符号,它具有一维条码及其它二维条码所具有的信息容量大、可靠性高、可表示汉字及图象多种文字信息、保密防伪性强等优点。

二、二维码生成库的源码

Github上的大佬 Nayuki:https://github.com/nayuki 提供了QR Code码相关的图片生成库,包含了C、C++、Java、JavaScript 、Python 、Rust 等语言的各个版本,代码简洁清晰,质量非常高。

我也把这份代码fork到了我的仓库中,如果想重现我的操作也可以从我的Github主页上获取相关的源代码 https://github.com/gengyuchao/QR-Code-generator

本次我使用的是c++版本的代码 文件夹名为cpp

三、创建Qt工程

1、在windows下创建Qt工程

 点击下一步直至完成

 2、添加库源文件

将下载的 QR-Code-generator-master.zip 中的 cpp文件夹里的

“BitBuffer.cpp”、“BitBuffer.hpp”、

“QrCode.cpp”、“QrCode.hpp”、

“QrSegment.cpp”、“QrSegment.hpp”、

解压到工程目录“G:\Qt_Project\Create_QRcode”下

最一开始的工程目录是这样子的,然后我们在工程文件夹上右击,选择Add Existing Directory 把刚刚解压的库文件添加进去

取消勾选已有的 main.cpp 、mainwindows.cpp 、mainwindows.h 然后 点击OK即可

添加后的工程目录变成了这样

运行之后发现没有错误(如果你不小心在上一步直接点了OK、工程会报错,原因是重复添加了之前的文件 右击打开pro文件 删除重复的 main.cpp 、mainwindows.cpp 、mainwindows.h 即可)

3、编写二维码绘制函数

根据库的说明文档,我们可以知道这个库的使用方法如下:

C++ language:

#include <string>
#include <vector>
#include "QrCode.hpp"
using namespace qrcodegen;

// Simple operation
QrCode qr0 = QrCode::encodeText("Hello, world!", QrCode::Ecc::MEDIUM);
std::string svg = qr0.toSvgString(4);

// Manual operation
std::vector<QrSegment> segs =
    QrSegment::makeSegments("3141592653589793238462643383");
QrCode qr1 = QrCode::encodeSegments(
    segs, QrCode::Ecc::HIGH, 5, 5, 2, false);
for (int y = 0; y < qr1.getSize(); y++) {
    for (int x = 0; x < qr1.getSize(); x++) {
        (... paint qr1.getModule(x, y) ...)
    }
}

添加头文件#include <string> #include <vector> #include "QrCode.hpp" 使用命名空间

using namespace qrcodegen;

然后就可以使用下面的函数了

于是我创建了函数  void Show_QRcode_Picture() 并把它添加进 mainwindows.h头文件中

void MainWindow::Show_QRcode_Picture()
{
    // Manual operation
    std::vector<QrSegment> segs =
        QrSegment::makeSegments("3141592653589793238462643383");
    QrCode qr1 = QrCode::encodeSegments(
        segs, QrCode::Ecc::HIGH, 5, 5, 2, false);
    for (int y = 0; y < qr1.getSize(); y++) {
        for (int x = 0; x < qr1.getSize(); x++) {
            //(... paint qr1.getModule(x, y) ...)
        }
    }
}

将实例代码添加进去

我的方案是

使用Qt的QImage进行图像的编辑 ->转换为QPixmap-> 在QLabel中显示

4、在mainwindows.ui中添加控件

添加QLabel、QTextEdit和一个Button按钮

5、代码实现

//添加头文件:
#include "QImage"

    //创建二维码画布
    QImage QrCode_Image=QImage(qr1.getSize(),qr1.getSize(),QImage::Format_RGB888);
    //图像大小转换为适当的大小
    QrCode_Image=QrCode_Image.scaled(ui->label->width(),ui->label->height(),
                    Qt::KeepAspectRatio);
    //转换为QPixmap在Label中显示
    ui->label->setPixmap(QPixmap::fromImage(QrCode_Image));

 

完整代码如下:

void MainWindow::Show_QRcode_Picture(QString message)
{

    // Manual operation
    std::vector<QrSegment> segs =
        QrSegment::makeSegments(message.toLatin1());
    QrCode qr1 = QrCode::encodeSegments(
        segs, QrCode::Ecc::HIGH, 5, 5, 2, false);
    //创建二维码画布
    QImage QrCode_Image=QImage(qr1.getSize(),qr1.getSize(),QImage::Format_RGB888);

    for (int y = 0; y < qr1.getSize(); y++) {
        for (int x = 0; x < qr1.getSize(); x++) {
            if(qr1.getModule(x, y)==0)
                QrCode_Image.setPixel(x,y,qRgb(255,255,255));
            else
                QrCode_Image.setPixel(x,y,qRgb(0,0,0));
        }
    }

    //图像大小转换为适当的大小
    QrCode_Image=QrCode_Image.scaled(ui->label->width(),ui->label->height(),
                    Qt::KeepAspectRatio);
    //转换为QPixmap在Label中显示
    ui->label->setPixmap(QPixmap::fromImage(QrCode_Image));

}

void MainWindow::on_Create_Button_clicked()
{
    Show_QRcode_Picture(ui->textEdit->toPlainText());
}

6、需要注意

下面内容摘自百度百科:

1、符号规格从版本1(21×21模块)到版本40(177×177 模块),每提高一个版本,每边增加4个模块。

2、数据类型与容量(参照最大规格符号版本40-L级):

数字数据:7,089个字符

字母数据: 4,296个字符

8位字节数据: 2,953个字符

汉字数据:1,817个字符

3、数据表示方法:

深色模块表示二进制"1",浅色模块表示二进制"0"。

4、纠错能力:

L级:约可纠错7%的数据码字

M级:约可纠错15%的数据码字

Q级:约可纠错25%的数据码字

H级:约可纠错30%的数据码字

5、结构链接(可选)

可用1-16个QR Code码符号表示一组信息。每一符号表示100个字符的信息。

当前的规格为5,如果你的内容超过了最大数据量,就会造成程序崩溃。如果需要在二维码中添加更多的信息,你可以适当地修改模块版本,以增大数据容量。

最后的效果

至此,我们的二维码生成器就做好了。欢迎大家和我一起交流讨论。整个工程我已经上传至我的Github主页上(https://github.com/gengyuchao/Create_QRcode),欢迎访问~

  • 14
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
### 回答1: C 嵌入式识别二维码 Qrcode 是一种在嵌入式系统中使用 C 语言识别二维码的技术。二维码是一种流行的图像模式,可用于在不同的应用程序和场景中传递信息。嵌入式系统通常被用于对图像的处理和分析,因此嵌入式系统中实现 Qrcode 识别对于许多应用程序至关重要。 实现 Qrcode 识别,需要使用一些开源库和工具,如 OpenCV 和 ZBar 等。 OpenCV 是一种流行的计算机视觉库,它为嵌入式系统提供丰富的图像处理和分析功能;而 ZBar 是一种针对二维码和条形码的跨平台库,可用于识别各种类型的二维码。 在使用 C 嵌入式识别二维码 Qrcode 的过程中,需要进行一些必要的基本设置,例如摄像头设置、采样率设置、图像处理和输出设置等。在处理二维码时,图像需要进行预处理,包括图像分割、增强、二值化和去噪等。此外,还需要进行二维码检测和解码,以获取二维码中包含的信息。 总的来说,C 嵌入式识别二维码 Qrcode 是一种十分重要的技术,它可以用于许多领域,例如智能物流、智能家居、智能交通和医疗等领域,能够提高系统的智能化程度,为用户带来更多的便利。 ### 回答2: 二维码是一种广泛应用于商业和生活中的图形编码技术。当我们需要获取其中的信息时,我们通常需要使用一些设备来读取其中的信息。嵌入式系统可以很好地实现二维码的识别功能。 嵌入式系统一般采用图像识别技术来实现对二维码的扫描和解析。应用程序可以通过图像采集模块来获取相机所捕捉到的图像,并进行预处理和分析,从而确定图像中是否存在二维码。如果存在二维码,系统将会进一步对图像进行解析,提取出其中的信息。最后将解析出的信息传输至外部系统。 由于二维码的图形信息较为简单,因此可以通过基于面积的方法来识别二维码。在读取二维码时,我们可以通过计算二维码内的黑色像素点占据的面积与整个二维码的面积的比例来确定是否正确读取了二维码。除此之外,我们还可以采用二值化、灰度化等方法对图像进行预处理,提高识别的稳定性和准确性。 总之,嵌入式系统的二维码识别技术有着较高的实用价值,可以在自动售货机、智能门禁系统、自助购物系统等场景中广泛应用。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值