查看: 1830|回复: 2

[评测分享] 【更适合初学者的开发板ELF 1】09-移植二维码类库并测试

[复制链接]
  • TA的每日心情
    奋斗
    前天 18:23
  • 签到天数: 213 天

    连续签到: 6 天

    [LV.7]常住居民III

    发表于 2023-12-4 22:12:47 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 stm1024 于 2023-12-4 22:17 编辑

    二维码基本信息

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

    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个字符的信息。


    嵌入式Linux+Qt环境下使用QRCode

    Github上有很多关于QRCode生成的库,比较好用的是这个:

    https://github.com/nayuki/QR-Code-generator

    提供了QR Code码的生成库,包含了C、C++、Java、JavaScript 、Python 、Rust 等语言的版本,代码简洁清晰,无需额外的配置,而且隐藏了很多二维码的技术细节,使用方便快捷。


    下载以后软件包中内容如下:

    11.png


    由于我们使用的是QT,因此,需要使用cpp文件夹下面的版本,该文件夹打开之后可以看到有五个文件:


    22.png


    实际上需要用的是第二个和第三个,亦即qrcodegen的cpp源文件和hpp头文件。另外一个名为QrCodeGeneratorDemo.cpp的文件,实际上是一个示例测试程序,告诉你该怎么使用这个类库,有没有它都不影响程序的功能。

    打开QTCreator,新建一个QWidget的窗口程序,然后将前面提到的qrcodegen.cpp和qrcodegen.hpp文件放入该项目下,并在QTCreator中加入对该文件的引用,最后项目文件夹和项目组织如下:

    44.png

    界面设计:

    55.png

    三个控件,分别是一个pushButton,一个lineEdit和一个Label。

    在widget.h中加入必要的头文件引用,命名空间, 以及函数声明等:

    1. #ifndef WIDGET_H
    2. #define WIDGET_H

    3. #include <QWidget>
    4. #include <QPainter>
    5. #include <QDebug>
    6. #include "qrcodegen.hpp"

    7. using namespace qrcodegen;

    8. QT_BEGIN_NAMESPACE
    9. namespace Ui { class Widget; }
    10. QT_END_NAMESPACE

    11. class Widget : public QWidget
    12. {
    13.     Q_OBJECT

    14. public:
    15.     Widget(QWidget *parent = nullptr);
    16.     ~Widget();

    17. private slots:
    18.     void on_pb_gen_clicked();

    19. private:
    20.     Ui::Widget *ui;

    21.     /*
    22.      * draw image by with the qrCode class
    23.      * qr: QrCode class instance with the encoded data
    24.      * blocksize: the block size of the white/black module
    25.      * margin:the margin of the QRCode data to the image border
    26.      * return: the QImage the represent the QRCode
    27.      */
    28.     QImage drawImage(QrCode qr,int blockSize=3,int margin=0);
    29. };
    30. #endif // WIDGET_H
    复制代码

    其中槽函数void on_pb_gen_clicked()是一会自动生成的。

    代码中主要是添加了一个名为drawImage的函数,它是将QRCode的编码值,转化为我们通常看到的黑白QRCode图片形式,以下是widget.cpp中的实现:

    1. <font size="2">QImage Widget::drawImage(QrCode qr,int blockSize,int margin)
    2. {
    3.     QImage img;
    4.     if(blockSize<1)
    5.         blockSize=1;
    6.     if(margin<0)
    7.         margin=0;
    8.     img=QImage(qr.getSize()*blockSize+2*margin,qr.getSize()*blockSize+2*margin,QImage::Format_RGB888);
    9.     QPainter painter(&img);
    10.     //draw white background
    11.     painter.setPen(Qt::NoPen);
    12.     painter.setBrush(QColor(Qt::white));
    13.     QRect rect = QRect(0,0,img.width(),img.height());
    14.     painter.drawRect(rect);
    15.     //prepare the module block(only need to draw modules with '1' bit)
    16.     painter.setBrush(QColor(Qt::black));
    17.     QRect rectDraw=QRect(0,0,blockSize,blockSize);

    18.     for (int y = 0; y < qr.getSize(); y++)
    19.     {
    20.         for (int x = 0; x < qr.getSize(); x++)
    21.         {
    22.             if(qr.getModule(x, y))
    23.             {
    24.                 rectDraw.moveLeft(margin+x*blockSize);
    25.                 rectDraw.moveTop(margin+y*blockSize);
    26.                 painter.drawRect(rectDraw);
    27.             }
    28.         }
    29.     }
    30.     return img;
    31. }
    32. </font>
    复制代码

    这个函数的作用就是使用QrCode类的实例,绘制其对应的二维码图形,第一个参数就是带有QR编码的实例,第二个参数是图片所使用色块大小,也就是表示module的小方块,而第三个参数则是图片的边框宽度。

    生成图片以后,显示很简单,总的思路就是从lineEdit中获取字符串,调用drawImage生成图片,然后用QLabel显示图片,pushButton的槽函数如下:

    1. void Widget::on_pb_gen_clicked()
    2. {
    3.     if(ui->le_input->text()=="")
    4.         return;
    5.     const QrCode qr = QrCode::encodeText(ui->le_input->text().toStdString().c_str(),QrCode::Ecc::MEDIUM);
    6.     qDebug()<<"QRCode Version ="<<qr.getVersion()
    7.             <<"QRCode Size ="<<qr.getSize()
    8.             <<"QRCode Mask ="<<qr.getMask();
    9.     drawImage(qr,1);    ui->lb_qrImg->setPixmap(QPixmap::fromImage(drawImage(qr,4,1)));
    10. }
    复制代码

    然后再虚拟机环境中编译,最后下载到ELF-1开发板上,修改权限并运行:

    2023-12-04_221229.png

    可以看到,在控制台中还会显示QRCode的相关信息。



    33.png
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-1-7 21:17
  • 签到天数: 775 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2023-12-6 20:44:28 | 显示全部楼层
    black sheep wall
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    前天 18:23
  • 签到天数: 213 天

    连续签到: 6 天

    [LV.7]常住居民III

     楼主| 发表于 2023-12-7 08:59:20 | 显示全部楼层

    哈哈,你这个是开图吧?还有很多秘籍
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    手机版|小黑屋|与非网

    GMT+8, 2025-1-30 13:04 , Processed in 0.137944 second(s), 21 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.