基于QRencode的 QT二维码显示 QImage像素操作和QPainter

Linux下QT集成qrencode库实现二维码生成开发实战 二维码作为一种高效的数据载体,其核心原理是基于特定的编码规则将信息转换为二维矩阵图形,具备信息容量大、容错性强、可快速识读等技术价值,广泛应用于移动支付、产品溯源、信息交换等场景。在Linux桌面应用开发中,QT框架因其跨平台特性和丰富的图形组件成为首选。为实现二维码生成功能,开发者无需从零实现复杂的编码规范,可通过集成成熟的第三方C语言库qrencode来高效完成。qrencode库专注于将字符串数据转换为二维码点阵数据,API简洁且不依赖其他图形库,与QT的C++生态完美契合。本实战项目详细讲解了在QT 阅读详情

QRencode库

1,QRencode库的github源址 2,文档

QRencode简单介绍

  • 该库提供了一种快速构建二维码的方案,由于使用C语言编写,所以移植性非常好,如果不想移植可以下载github源码后将所有源文件添加进工程目录即可。
  • 能够快速将字符串转换为uchar型数据,其中每一个字节的最后一位都代表该处是黑点还是白点,可以根据返回的数据直接进行绘画二维码。
  • 还可以将结构体数据转化为二维码,使用该库的QRinput类型即可。在其唯一的头文件qrencode.h可以看到所有可操作的函数。

常用的API是QRcode_encodeString(),调用之后返回的QRcode->date就是以qrcode->width*qrcode->width的一个正方形数据,其中每一个数据点的第0位就代表这个点是黑还是白,如图1-1所示

在这里插入图片描述
( 图 1-1 QRcode->date的数据格式)


Qt中使用QRencode库显示二维码

方法一(QImage直接修改操作像素点,但只有黑白灰色)

// 把输入的字符串换成 QRcode源数据
void MainWindow::encode_string_toQR(QByteArray src,int w)
{
    unsigned char* line = NULL;
    QRcode * qrcode = NULL;
    unsigned char b;

    //  源数据、最小输出、最高错误修正、utf-8编码、区分大小写(1)
    qrcode = QRcode_encodeString(src.data(),2,QR_ECLEVEL_Q,QR_MODE_8,1);
    if(qrcode)
    {
        qint32 qrcode_width = qrcode->width;
        qint32 scale_x      = w / (double)qrcode_width; // 获取缩放比例

        qDebug() << " qrcode_width:" << qrcode->width << "  w:" << w << "  scale_x:" << scale_x;

        QImage img(w,w,QImage::Format_Indexed8);
        img.fill(0xff);

        for(int y = 0; y < qrcode_width; y ++)
        {
            // 重复的列循环
            for(auto x = 0;x <scale_x;x++)
            {
                //获取行像素进行修改
                line = img.scanLine(y* scale_x + x);

                // 修改一行的像素
                for(int x = 0 ;x < qrcode_width ; x++ )
                {
                    // 重复的行循环
                    b = qrcode->data[y * qrcode_width + x];
                    if(b & 0x1){
                        for(auto i = 0;i<scale_x;i++)
                            line[x*scale_x + i] = black ;
                    }
                    else{
                        for(auto i = 0;i<scale_x;i++)
                            line[x*scale_x + i] = white ;
                    }

                }

            }
        }
        
//-------------------------显示QImage部分,不重要--------------------------------------
        ui->label->setPixmap(QPixmap::fromImage( img ));
        QRcode_free(qrcode);
    }
    else{
        qDebug() << "is return NULL!" << strerror(errno);
    }
}

这个方法显示二维码图片的优缺点如下:
优点

  • 速度较快 (当数据量超过130个英文utf-8字符,图片放大到QT设计的301*301时,耗时为1~2ms)
  • 因为放大倍数(生成二维码图片的大小与label大小之间的倍差),数据过大的时候就算铺不满整个label,也能保证是一张完整的二维码图片(如图1-3)
  • 原因:放大倍数计算的时候会忽略四舍五入导致4.7、2.6等情况被算为4和2,导致铺不满,而四舍五入又会导致访问越界

缺点

  • 绘制完成后的img对象,不能调用scaled调整函数,因为返回的QImage对象是全黑(如图1-2),具体原因还不知道,等日后有时间在研究底层逻辑。(可能是我学识较浅,欢迎各位评论区指正!)
  • 由于在新建Qimage用的是QImage::Format_Indexed8,所以绘出的二维码图片只有黑白灰三色。

图片 1-2 绘画完成的二维码img不允许调用scaled放大
在这里插入图片描述


方法二(QImage + QPainter , 可自定义颜色,可以自由变换)

代码参考处

// 把字符串转为二维码数据qrpic, w 和 h 分别是该二维码图像的宽和高  ----使用QPainter操作
void MainWindow::encode_string_toQR_painter(QByteArray src, int w)
{
    QRcode * qrcode = NULL;
    unsigned char b;

    //  源数据、最小输出、最高错误修正、utf-8编码、区分大小写(1)
    qrcode = QRcode_encodeString(src.data(),2,QR_ECLEVEL_Q,QR_MODE_8,1);
    if(qrcode)
    {
        qint32 qrcode_width = qrcode->width;
        qint32 scale_x      = qRound(w / (double)qrcode_width); // 获取缩放比例  - 使用四舍五入

        //qDebug() << " QPainter: qrcode_width:" << qrcode->width << "  w:" << w << "  scale_x:" << scale_x;

        QImage img(w,w,QImage::Format_RGB32);
        img.fill(0xffffffff); // 填充背景为白色 RGB


        // 新建画笔并设置绘画的对象
        QPainter painter(&img);
        painter.setBrush(QColor(0,0,0)); // 要使二维码颜色不同,可以在这里修改
        painter.setPen(Qt::NoPen);

        for(int y = 0; y < qrcode_width; y ++)
        {
            for(int x = 0 ;x < qrcode_width ; x++ )
            {
                b = qrcode->data[y * qrcode_width + x];

                if(b & 0x01)
                {
                    // 把矩形当做二维码上的一个个黑点,放大填充进图片
                    QRectF rect(x*scale_x ,y*scale_x ,scale_x,scale_x);
                    painter.drawRect(rect);
                }
            }
        }

//-------------------------显示QImage部分,不重要--------------------------------------
        ui->label_2->setPixmap(QPixmap::fromImage( img ));
        QRcode_free(qrcode);
    }
    else
    {
        qDebug() << "is return NULL!" << strerror(errno);
    }
}

这个方法显示二维码的优缺点如下:
优点

  • 能随意改变二维码的背景色、及点阵图色。如可改成白底绿码、灰底黄码。
  • 跟上面的操作像素不同,绘画完成的二维码图可以随意scaled变换大小且不会失真

缺点

  • 速度较慢 (当数据量超过130个英文utf-8字符,图片放大到QT设计的301*301时,耗时为3~4ms)
  • 因为放大倍数(生成二维码图片的大小与label大小之间的倍差),数据过大的时候会超过整个label,不是一张完整的二维码图片(如图1-3)
  • 原因:当放大倍数过大的时候,单次绘画的矩形painter.drawRect(rect); 过大,导致最终图片显示不全(与像素操作相比,QPainter的方法使用了四舍五入。)

图1-3 放大倍数过大的时候,像素画图会铺不满,而QPainter会显示不全
在这里插入图片描述


常见图片格式的文件标识符

下面是一些常见图片格式,开头固定文件头的标识符,可以用来区分是什么图片:

  • BMP: 0x42 0x4D,即ASCII字符 “BM” 的16进制表示。
  • PNG:0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A 即ASCII字符 “PNG\r\n\x1a\n” 的16进制表示,用于标识PNG文件的开始。
  • JPEG (JPG): 0xFF 0xD8 ,文件结束标记是0xFF 0xD9。
  • GIF: 87a版本 0x47 0x49 0x46 0x38 0x37 0x61 或 89a版本0x47 0x49 0x46 0x38 0x39 0x61,这取决于GIF版本(87a或89a)。这些字节是ASCII字符 “GIF87a” 或 “GIF89a” 的16进制表示。
  • TIFF: 通常是 0x49 0x49 或 0x4D 0x4D,分别对应于Intel和Motorola字节序的TIFF文件。这些字节是ASCII字符 “II” 或 “MM” 的16进制表示。
  • ICO: 0x00 0x00 0x01 0x00

总结

由于QRencode计算后返回的数据就是二维码的点阵图,所以只需要考虑循环方式,然后循环内部根据返回数据的对应位是0 or 1即可绘画出一张二维码图。故实现方法有很多,在这里仅作记录给大家提供一个思路参考。 如果有更好的方法或以上程序改进方式欢迎在评论区指正! 大家一起进步!

Linux QT应用集成qrencode库实现二维码生成功能实战指南 二维码作为一种高效的信息载体技术,其核心原理是将数据编码成特定格式的矩阵图形,通过容错纠错算法确保信息可被可靠读取。在软件开发领域,集成成熟的二维码生成库是提升开发效率、保证功能稳定性的常见工程实践。对于基于C++的跨平台GUI应用开发,QT框架因其丰富的组件和良好的可移植性而被广泛采用。当需要在Linux桌面环境下为QT应用添加二维码生成能力时,qrencode库凭借其轻量、高效和清晰的C语言接口,成为理想的技术选型。本文将探讨如何通过CMake构建系统,在QT项目中无缝集成qrencode库,涵盖从环境 阅读详情

相关推荐

QT集成QRencode与Code128:从源码集成到界面绘制的条码生成实战

本文详细介绍了如何在QT框架中集成QRencode与Code128库,实现二维码和条形码的生成与界面绘制。通过源码集成、模块化配置和核心代码解析,帮助开发者快速掌握条码生成技术,适用于物流追踪、库存管理等场景,提升开发效率和应用性能。

weixin_26795617的博客 180

二维码编码库qrencode

1、说明: qrencode是一个快速而紧凑的库,用于将数据编码为QR Code符号(二维符号体系),该二维符号体系可以通过手持终端(例如带有CCD的手机)进行扫描。QR Code的容量最多为7000位数字或4000个字符,并且具有很高的鲁棒性。 QR码示例: qrencode接受字符串或数据块列表,然后在QR Code符号中编码为位图数组。当其他QR Code应用程序生成图像文件时,使用libqrencode允许应用程序直接从原始位图数据中呈现QR Code符号。该库还包含一个命令行实用程序,可输出各种

weixin_42887343的博客 7238

教外篇(6):C++ qrencode 实现二维码生成

本文主要介绍如何使用C++ 以及第三方开源库qrencode来生成一张二维码图片

余识- 2160

使用开源Qrencode库生成二维码并植入指定图片中Dev C++实现

采用开源的Qrencode库来生成二维码,用DevC++实现将4G设备的 SIM卡号uid以二维码的形式植入到模板图像数据并生成图片文件以方便打印到不干胶标签上,标签显示硬件信息及卡号,方便后续管理。

weixin_48341920的博客 1714

QT生成二维码

QR码(全称为快速响应矩阵码;英语:Quick Response Code)是二维条码的一种,于1994年由日本DENSO WAVE公司发明。QR来自英文Quick Response的缩写,即快速反应,因为发明者希望QR码可以让其内容快速被解码。QR码使用四种标准化编码模式(数字,字母数字,字节(二进制)和汉字)来存储数据。QR码最常见于日本,为目前日本最流行的二维空间条码。QR码比较普通条码可以存储更多数据,也无需要像普通条码般在扫描时需要直线对准扫描仪。

MusicScore的博客 1220

基于Qt的C++二维码生成与图片嵌入实战项目

在现代软件开发中,二维码(QR Code)作为一种高效的信息载体,广泛应用于支付系统、身份认证、数据传输等场景。Qt作为跨平台C++图形用户界面开发框架,凭借其强大的图像处理与GUI构建能力,为开发者提供了实现自定义二维码生成的完整解决方案。本章将从二维码的基本结构出发,深入剖析Qt环境下二维码生成的技术原理与核心组件,重点介绍基于qrencode库或自研算法结合QImageQPainter等类实现二维码绘制的可行性路径。

weixin_42571280的博客 795

Qt 二维码超简单示例

Qt 二维码开发示例(超简单) Qt 生成二维码需要使用第三方库,目前最常用的是 qrencode 库。 安装 qrencode 库 在 Manjaro 上直接 sudo pacman -S qrencode 安装即可。不能自动安装的也可以通过源码进行编译,config 之后 make 就能搞定,源码中有 cmake 文件,因此也可以使用 Qt cmake 进行编译。 一点点说明 一开始以为 qrencode 会直接输出二维码图像,但实际上不是这样的,导致编码困难。qrencode 输出的只是二维码数据

Lion Chen i 咖啡 1561

Windows下用QT编译qrencode库,用于显示二维码

Windows下用QT编译qrencode库,用于显示二维码

kangzhaofang的博客 2677

深入浅出之QRencode

QRencode是一个开源的库,用于生成二维码(QR Code)。二维码是一种可以存储大量数据的二维条码,它可以被许多设备(如智能手机、平板电脑等)上的相机快速读取。qrencode提供了简单易用的 API,使得在应用程序中集成二维码生成功能变得非常容易。官网。

浩瀚之水的专栏 1312

qrencode-3.4.4:二维码编码库的全面源码分析

在我们数字化的世界里,二维码已无处不在,它用最小的空间编码了大量的信息,成为连接现实世界和数字世界的桥梁。qrencode是一个广泛使用的开源二维码编码库,它能够生成各种格式的二维码,提供了丰富的接口供开发者使用,从而使得在软件应用中集成二维码生成功能变得轻松快捷。qrencode库采用纯C语言编写,具有良好的跨平台性能,支持多种操作系统如Linux、Unix、Mac OS X和Windows。开发者可以根据自己的项目需求,在不同的环境中灵活地进行编译和使用。

weixin_30336531的博客 1423

使用 qrencode 库在 QT 中实现二维码生成 DEMO

本文还有配套的精品资源,点击获取 简介:本文将详细介绍如何结合使用 qrencode 库和 QT 框架来生成二维码,展示从集成库到实现图形界面用户交互的完整过程。通过创建一个封装了生成逻辑的 QRCodeGenerator 类,并在 QT 应用中通过按钮触发生成和显示二维码图像,提供了一个用户友好的二维码生成器 DEMO。 1. qrencode 库与 QT 结合...

weixin_29092787的博客 1553

C/C++二维码生成库qrencode编译与使用

qrencode 是一个用于生成 QR 码(Quick Response Code)的工具和库。QR 码是一种矩阵条形码或二维条形码,能够在水平和垂直方向上存储信息。qrencode 支持多种编码方式,并能够生成不同复杂度和错误校正级别的 QR 码。

new9232的博客 4346

Qt-qrencode生成二维码

将qrencode使用Qt封装为一个生成、显示二维码的控件; 支持使用QPainter绘制显示二维码; 可通过函数接口返回生成的二维码QImage; 可通过调用函数将生成的二维码保存到指定路径; 支持使用源码嵌入工程(更好的跨平台、支持各种编译器); 支持使用编译好的静态库(MSVC2017-64);

mahuifa的博客 2826

[2021]Linux下C语言qrencode二维码生成库的基本使用和ARM开发板移植

Linux下使用qrencode的资料还是蛮少的,总会出现一些奇怪的问题。 在解决问题的时候,大多数都是在windows下结合QT来使用的。所以我在Linux下解决使用的问题也废了挺多功夫,本文将详细的描述。 我就纳闷了,为什么非得用QT呢,百度出来的文章几乎都是一样的。我就想写一个不一样的。

TrueDei 3752

QRencode库 用于二维码生成

QRencode库 用于二维码生成 C++

教程 | VeriStand硬件在环仿真测试第一章

这篇是系列文章的第一章,满满的都是干货,感兴趣的话欢迎一起交流探讨。

HUASUITECH的博客 1万+

二维码QRcode生成的最好方法

二维码QRcode的生成和二维码原理 二维码是二维条形码的一种,又叫QR码,可以将网址、文字、照片等信息通过相应的编码算法编译成为一个方块形条码图案,手机用户可以通过摄像头和解码软件将相关信息重新解码并查看内容 随着智能手机和移动互联网的兴起,二维码已成为网页浏览、应用下载、手机购物、移动支付等服务的重要入口,目前已被广泛应用于数字内容下载、自动化文字传输、网址快速连接、身分鉴别与商务

Websites 9966

别再为reg2icg的setup违例头疼了!手把手教你用ICC2/Innovus这3招搞定(附实战数据对比)

本文详细介绍了在ICC2/Innovus中解决reg2icg的setup违例的三种高效方法,包括早期时钟树预估、精准控制时钟延迟与门控检查以及ICG专用优化选项组合。通过实战数据对比,展示了不同策略的效果差异,帮助工程师快速优化时序路径,提升芯片性能。

weixin_42569329的博客 408

使用QRencode生成二维码

C++使用QRencode库生成二维码

心愿许得无限大 1265

手把手教你用Qt和DSP28335实现串口Bootloader,附赠源码和避坑指南

本文详细介绍了如何使用Qt和DSP28335实现串口Bootloader,包括开发环境搭建、通信协议设计、Qt上位机开发、DSP端Bootloader核心实现以及应用程序工程的特殊配置。通过实战案例和源码分享,帮助开发者快速掌握嵌入式固件升级技术,提升工业设备远程升级的效率和可靠性。

weixin_29176179的博客 134

思科路由器重分发(静态路由+OSPF动态路由+RIP动态路由)

思科路由器重分发(静态路由+OSPF动态路由+RIP动态路由)

2301_81256766的博客 1260

C++中生成二维码-libqrencode

C++中生成二维码:libqrencode

大草的博客 2831

【PVE9.1使用教程】

弹窗代码在 /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js 中,通过 void({…}) 可以让弹窗部分代码不执行,实现删除弹窗的效果。安装过程这里不再赘述,记得不要使用网络版本进行安装,安装的时候不要使用镜像,否则安装过程会很卡。把下面的配置添加进去,允许同一个网段下的所以主机访问/mnt/pve_share文件夹。可以自己搭建也可以去咸鱼购买,本人在咸鱼上面购买的,暂时可用。也可以使用下面的命令,版本号需要自己查看最新的版本号。

weixin_42950821的博客 960
上一篇: Linux-添加systemd自启动服务 + 内网穿透模块NPC自启动(x96-coreelec squashfs固件修改)
下一篇: C/C++ 使用 # 打印枚举常量的枚举名称字符串
温柔大猩猩
博客等级 码龄7年 65粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值