2回答

0收藏

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

#板卡评测 #板卡评测 2336 人阅读 | 2 人回复 | 2023-12-04

本帖最后由 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 等语言的版本,代码简洁清晰,无需额外的配置,而且隐藏了很多二维码的技术细节,使用方便快捷。


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


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



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

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

界面设计:

三个控件,分别是一个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开发板上,修改权限并运行:

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



33.png (40.83 KB, 下载次数: 7)

33.png
分享到:
回复

使用道具 举报

回答|共 2 个

倒序浏览

沙发

lospring

发表于 2023-12-6 20:44:28 | 只看该作者

black sheep wall
回复 支持 反对

使用道具 举报

板凳

stm1024

发表于 2023-12-7 08:59:20 | 只看该作者


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

使用道具 举报

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

本版积分规则

5300 积分
55 主题
+ 关注
热门推荐
关闭

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