ubuntu下qrencode arm 环境编译和使用

发布于:2024-05-08 ⋅ 阅读:(22) ⋅ 点赞:(0)

我有一个Linux 环境 V3S的qrm开发板,我需要在开发板上实现一个生成二维码的功能,于是想到了qrencode 这个库。

过程如下:

1,下载qrencode 源码(自行百度下载)

2,打开源码,可以看到源码里有一个configure 的配置文件

这个文件就是斌阿姨qrencode.so文件的关键配置文件,如果我们想编译当前ubuntu 的linux环境下的.so文件,那么我们只需要执行:

./configure
make
sudo make install

就可以将编译出来的so库安装到当前ubuntu电脑里,如果想指定安装路径,只需要

执行如下指令:

./configure --prefix=/path/to/install/directory
make
sudo make install
可以看到,执行配置文件的时候多了一个路径

3,那么如何编译V3S开发板环境下的libqrencode.so呢?

此时我们就需要根据自己的交叉环境进行配置了。

我自己写了一个脚本,脚本内容如下:

#!/bin/sh
export CC=/media/user1/V3SSDK_BUILDROOT/v3ssdk/buildroot/out/host/bin/arm-buildroot-linux-gnueabihf-gcc
export CXX=/media/user1/V3SSDK_BUILDROOT/v3ssdk/buildroot/out/host/bin/arm-buildroot-linux-gnueabihf-g++
export AR=/media/user1/V3SSDK_BUILDROOT/v3ssdk/buildroot/out/host/bin/arm-buildroot-linux-gnueabihf-ar
export AS=/media/user1/V3SSDK_BUILDROOT/v3ssdk/buildroot/out/host/bin/arm-buildroot-linux-gnueabihf-as
export LD=/media/user1/V3SSDK_BUILDROOT/v3ssdk/buildroot/out/host/bin/arm-buildroot-linux-gnueabihf-ld
export RANLIB=/media/user1/V3SSDK_BUILDROOT/v3ssdk/buildroot/out/host/bin/arm-buildroot-linux-gnueabihf-ranlib
export STRIP=/media/user1/V3SSDK_BUILDROOT/v3ssdk/buildroot/out/host/bin/arm-buildroot-linux-gnueabihf-strip

./configure --host=arm-linux-gnueabihf --prefix=/home/wangxiaojing/qrencode-4.1.1/arm

在make 之前,我先执行这个脚本,就可以生成arm版本的.so文件

其中 /home/wangxiaojing/qrencode-4.1.1/  是我的源码目录,我在改目录下新建了一个arm目录

编译完成后就会生成libqrencode.so 以及各种编译后的文件到这个目录里

可以看到export CC    export CXX  AR LD 等这些环境变量都设置成了自己交叉编译环境的路径,可根据自己环境惊醒配置,这样就可以编译出适配自己开发板的.so文件

4,代码如何实现生成二维码的功能。,这里我封装成一个方法如下:

void generateMonoQRCode(const QString& data, const QString& filePath)
{
    QRcode* qrcode = QRcode_encodeString(data.toUtf8().constData(), 0, QR_ECLEVEL_L, QR_MODE_8, 1);
    if (qrcode != nullptr) {
        QImage image(qrcode->width, qrcode->width, QImage::Format_Mono);

        for (int y = 0; y < qrcode->width; y++) {
            for (int x = 0; x < qrcode->width; x++) {
                unsigned char b = qrcode->data[y * qrcode->width + x];
                image.setPixel(x, y, b&0x01 ? 0 : 1);
            }
        }

        QImageWriter writer(filePath, "png");
        writer.write(image);
        QRcode_free(qrcode);
    }
}

传入要生成二维码的数据,和要生成文件的路径,就可以生成一个二维码到这个路径下面,路径是包含文件名的。

生成后的图片可能大小尺寸可能过大或过小,此时我们需要再写一个方法用来改变这个二维码的大小:

void scaleImage(const QString &inputFilePath, int scaledWidth, int scaledHeight,QString& outputFilePath) {
    // 加载图片
    QImage inputImage(inputFilePath);
    if (inputImage.isNull()) {
        qDebug() << "图片加载失败";
        return ;
    }

    // 缩放图片
    QImage scaledImage = inputImage.scaled(scaledWidth, scaledHeight);
    // 保存缩放后的图片
    if (scaledImage.save(outputFilePath, "PNG")) {
        qDebug() << "图片缩放成功,保存路径为:" << outputFilePath << endl;
    } else {
        qDebug() << "图片缩放失败";
        return ;
    }

}

需要引入头文件:

#include <QTextCodec>
#include <QPainter>
#include <QImage>
#include <QWidget>
#include <qrencode.h>
#include <QImageWriter>


网站公告

今日签到

点亮在社区的每一天
去签到