Qt+libqrencode+QZXing 二维码生成原理和识别

开发环境 Ubuntu18.04 + qt 5.9.3 +libqrencode + QZXing

先下载libqrencode,Git 地址:https://github.com/fukuchi/libqrencode

解压后,cmake 一下,然后make 编译。


编译成功,将静态库和头文件单独拷贝。

在项目pro中使用库。

#-------------------------------------------------
#
# Project created by QtCreator 2018-05-05T20:15:37
#
#-------------------------------------------------
 
QT       += core gui
 
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
 
TARGET = Qrcode
TEMPLATE = app
 
# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGSa
 
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
 
 
SOURCES += \
        main.cpp \
        mainwindow.cpp \
    qrcode.cpp
 
HEADERS += \
        mainwindow.h \
    qrcode.h
 
FORMS += \
        mainwindow.ui
 
unix:!macx: LIBS += -L$$PWD/../qrcode/ -lqrencode
 
INCLUDEPATH += $$PWD/../qrcode
DEPENDPATH += $$PWD/../qrcode
 
unix:!macx: PRE_TARGETDEPS += $$PWD/../qrcode/libqrencode.a
 
unix:!macx: LIBS += -L$$PWD/../QZXing/ -lQZXing
 
INCLUDEPATH += $$PWD/../QZXing
DEPENDPATH += $$PWD/../QZXing
 
 

QRcodeEncode 源码:
#ifndef QRCODE_H
#define QRCODE_H

#include "qrencode.h"
#include <QColor>
#include <QPainter>

class QRcodeEncode
{
public:
    QRcodeEncode();
    void setString(QString str);
    int getQRWidth() const;
    bool saveImage(QString name ,int size);
    ~QRcodeEncode();
    void draw(QPainter &painter, int width, int height);

private:
    QRcode* qr;
    QString string;
};

#endif // QRCODE_H

#include "qrcode.h"

QRcodeEncode::QRcodeEncode()
{
    qr = new QRcode();
}

int QRcodeEncode::getQRWidth() const
{
    if(qr != NULL)
    {
        return qr->width;
    }
    else
    {
        return 0;
    }
}

QRcodeEncode::~QRcodeEncode()
{
    if(qr != NULL)
    {
        QRcode_free(qr);
    }
}
void QRcodeEncode::setString(QString str)
{
    string = str;
    if(qr != NULL)
    {
        QRcode_free(qr);
    }
    qr = QRcode_encodeString(string.toStdString().c_str(),1,QR_ECLEVEL_L,QR_MODE_8,1);
}

bool QRcodeEncode::saveImage(QString fileName, int size)
{
    if(size != 0 && !fileName.isEmpty())
    {
        QImage image(size, size, QImage::Format_Mono);
        QPainter painter(&image);
        QColor background(Qt::white);
        painter.setBrush(background);
        painter.setPen(Qt::NoPen);
        painter.drawRect(0, 0, size, size);
        if(qr != NULL)
        {
            draw(painter, size, size);
        }
        return image.save(fileName);
    }
    else
    {
        return false;
    }
}

void QRcodeEncode::draw(QPainter &painter, int width, int height)
{
    QColor foreground(Qt::black);
    painter.setBrush(foreground);
    const int qr_width = qr->width > 0 ? qr->width : 1;
    double scale_x = width / qr_width;
    double scale_y = height / qr_width;
    for( int y = 0; y < qr_width; y ++)
    {
        for(int x = 0; x < qr_width; x++)
        {
            unsigned char b = qr->data[y * qr_width + x];
            if(b & 0x01)
            {
                QRectF r(x * scale_x, y * scale_y, scale_x, scale_y);
                painter.drawRects(&r, 1);
            }
        }
    }
}

下载解码库 QZXing,https://github.com/ftylitak/qzxing/

解压后用Qt编译source中的源码。



编译完成后将库和头文件单独拷贝:

libQZXing.so    libQZXing.so.2.3    QZXing_global.h

libQZXing.so.2  libQZXing.so.2.3.0  qzxing.h

在项目中使用库。

窗体源码。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "qrcode.h"
#include <QPainter>
#include "qzxing.h"
#include <QDebug>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

protected:
    void paintEvent(QPaintEvent*);
    QSize sizeHint() const;
    QSize minimumSizeHint() const;
private:
    QString string;
    QRcodeEncode *m_qrcode;

    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    m_qrcode  =  new QRcodeEncode();
    m_qrcode->setString("Hello QR Code");
    QImage img;//解码很简单
    img.load("/home/rui/Code/build-Qrcode-Desktop_Qt_5_9_3_GCC_64bit-Debug/Qrcode.png");
    QZXing qzxing;
    qDebug()<<qzxing.decodeImage(img);
}

MainWindow::~MainWindow()
{

    delete ui;
}



QSize MainWindow::sizeHint() const
{
    QSize s;
    if(m_qrcode != NULL)
    {
        int qr_width = m_qrcode->getQRWidth() > 0 ? m_qrcode->getQRWidth() : 1;
        s = QSize(qr_width*4,qr_width*4);
    }
    else
    {
        s = QSize(50,50);
    }
    return s;
}

QSize MainWindow::minimumSizeHint() const
{
    QSize s;
    if(m_qrcode != NULL)
    {
        int qr_width = m_qrcode->getQRWidth() > 0 ? m_qrcode->getQRWidth() : 1;
        s = QSize(qr_width,qr_width);
    }
    else
    {
        s = QSize(50, 50);
    }
    return s;
}



void MainWindow::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    QColor background(Qt::white);
    painter.setBrush(background);
    painter.setPen(Qt::NoPen);
    painter.drawRect(0, 0, width(), height());
    if(m_qrcode != NULL)
    {
        m_qrcode->draw(painter, width(), height());
    }
}

生成和解码:


  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
libqrencode是一个C语言编写的库,用于生成二维条形码。生成的二维码可以通过手机的CCD摄像机轻松扫描出来。该库具有很强的鲁棒性,可以生成容量多达7000个数字或4000个字符的二维码。\[1\] 要使用libqrencode生成二维码,你需要以下几个步骤: 1. 下载稳定版本的libqrencode源代码包,可以从http://fukuchi.org/works/qrencode/下载。 2. 解压下载的源代码包,将其中的.h和.c文件拷贝到一个文件夹中,例如命名为libqrencode。 3. 创建一个工程,选择适合你的平台(如OSX或iOS)的应用程序模板。 4. 将libqrencode文件夹中的源代码添加到你的工程中。 5. 根据你的需求,调用libqrencode提供的函数来生成二维码。 这样,你就可以使用libqrencode库来生成二维码了。请注意,具体的实现细节可能因你的开发环境和需求而有所不同。\[2\]\[3\] #### 引用[.reference_title] - *1* *3* [基于libqrencode二维码生成](https://blog.csdn.net/SkyNullCode/article/details/49934699)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [使用libqrencode生成二维码,支持telphone,短信,url等](https://blog.csdn.net/u013295518/article/details/89680310)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值