[linux]使用libqrencode库生成二维码数据

一、需求

要将一段数据生成为二维码,

二、方案

使用linux标准库,通过libqrencode将需要写入的信息转为二维码图片数据。

三、实现

3.1编写c文件

#include <stdio.h>
#include <stdlib.h>
#include <qrencode.h>
int main() {QRcode *qrcode;unsigned char *data;int version = 1;int width = 256;int margin = 2;// 生成二维码数据qrcode = QRcode_encodeString("Hello, world!", version, QR_ECLEVEL_L, QR_MODE_8, 1);if (qrcode == NULL) {fprintf(stderr, "Failed to encode string.\n");return -1;}// 创建图像数据data = (unsigned char *)malloc(qrcode->width * qrcode->width * 3);if (data == NULL) {fprintf(stderr, "Failed to allocate memory.\n");QRcode_free(qrcode);return -1;}// 将二维码数据转换为图像数据for (int y = 0; y < qrcode->width; y++) {for (int x = 0; x < qrcode->width; x++) {int offset = (y * qrcode->width + x) * 3;if (qrcode->data[y * qrcode->width + x] & 0x01) {data[offset] = 0;   // Rdata[offset + 1] = 0;   // Gdata[offset + 2] = 0;   // B} else {data[offset] = 255;   // Rdata[offset + 1] = 255;   // Gdata[offset + 2] = 255;   // B}}}// 保存图像数据为PNG文件FILE *fp = fopen("qrcode.png", "wb");if (fp == NULL) {fprintf(stderr, "Failed to open file.\n");        QRcode_free(qrcode);free(data);return -1;}fwrite(data, 1, qrcode->width * qrcode->width * 3, fp);fclose(fp);// 释放内存QRcode_free(qrcode);free(data);printf("QR code generated and saved as qrcode.png.\n");return 0;
}

3.2编译c文件为可执行文件

3.2.1第一次编译

Evenurs@admin-PowerEdge-S350-166:~/f1c100s/dev/f1c100s/tina$ /home/Evenurs/f1c100s/dev/f1c100s/tina/prebuilt/gcc/linux-x86/arm/toolchain-sunxi-arm9-musl/toolchain/bin/arm-openwrt-linux-muslgnueabi-gcc qrencode.c -o qrencode

报错:

arm-openwrt-linux-muslgnueabi-gcc.bin: warning: environment variable 'STAGING_DIR' not defined
qrencode.c:3:22: fatal error: qrencode.h: No such file or directory^
compilation terminated.

分析:找不到qrencode.h头文件。

解决方法:编译时依赖库文件。

3.2.2第二次编译

Evenurs@admin-PowerEdge-S350-166:~/f1c100s/dev/f1c100s/tina$ /home/Evenurs/f1c100s/dev/f1c100s/tina/prebuilt/gcc/linux-x86/arm/toolchain-sunxi-arm9-musl/toolchain/bin/arm-openwrt-linux-muslgnueabi-gcc qrencode.c -o qrencode -lqrencode

报错:

arm-openwrt-linux-muslgnueabi-gcc.bin: warning: environment variable 'STAGING_DIR' not defined
qrencode.c:3:22: fatal error: qrencode.h: No such file or directory^
compilation terminated.

 分析:找不到库文件。

解决方法:需要指定头文件的路径。

3.2.3第三次编译

Evenurs@admin-PowerEdge-S350-166:~/f1c100s/dev/f1c100s/tina$ /home/Evenurs/f1c100s/dev/f1c100s/tina/prebuilt/gcc/linux-x86/arm/toolchain-sunxi-arm9-musl/toolchain/bin/arm-openwrt-linux-muslgnueabi-gcc -I /home/Evenurs/f1c100s/dev/f1c100s/tina/out/c200s-F1C200s/compile_dir/target/qrencode-3.4.4/ qrencode.c -o qrencode

报错:

arm-openwrt-linux-muslgnueabi-gcc.bin: warning: environment variable 'STAGING_DIR' not defined
arm-openwrt-linux-muslgnueabi-gcc.bin: warning: environment variable 'STAGING_DIR' not defined
arm-openwrt-linux-muslgnueabi-gcc.bin: warning: environment variable 'STAGING_DIR' not defined
/tmp/ccEgRQio.o: In function `main':
qrencode.c:(.text+0x3c): undefined reference to `QRcode_encodeString'
qrencode.c:(.text+0xc8): undefined reference to `QRcode_free'
qrencode.c:(.text+0x24c): undefined reference to `QRcode_free'
qrencode.c:(.text+0x2a0): undefined reference to `QRcode_free'
collect2: error: ld returned 1 exit status

分析:头文件已找到,库文件仍需要依赖。

解决方法:依赖库文件。

3.2.4第四次编译

Evenurs@admin-PowerEdge-S350-166:~/f1c100s/dev/f1c100s/tina$ /home/Evenurs/f1c100s/dev/f1c100s/tina/prebuilt/gcc/linux-x86/arm/toolchain-sunxi-arm9-musl/toolchain/bin/arm-openwrt-linux-muslgnueabi-gcc -I /home/Evenurs/f1c100s/dev/f1c100s/tina/out/c200s-F1C200s/compile_dir/target/qrencode-3.4.4/ qrencode.c -o qrencode -lqrencode

报错:

arm-openwrt-linux-muslgnueabi-gcc.bin: warning: environment variable 'STAGING_DIR' not defined
arm-openwrt-linux-muslgnueabi-gcc.bin: warning: environment variable 'STAGING_DIR' not defined
arm-openwrt-linux-muslgnueabi-gcc.bin: warning: environment variable 'STAGING_DIR' not defined
/home/Evenurs/f1c100s/dev/f1c100s/tina/prebuilt/gcc/linux-x86/arm/toolchain-sunxi-arm9-musl/toolchain/bin/../lib/gcc/arm-openwrt-linux-muslgnueabi/6.4.1/../../../../arm-openwrt-linux-muslgnueabi/bin/ld: cannot find -lqrencode
collect2: error: ld returned 1 exit status

分析:依然找不到库文件路径。

解决方法:在编译时指定寻找查找库文件的路径。

3.2.5第五次编译

Evenurs@admin-PowerEdge-S350-166:~/f1c100s/dev/f1c100s/tina$ /home/Evenurs/f1c100s/dev/f1c100s/tina/prebuilt/gcc/linux-x86/arm/toolchain-sunxi-arm9-musl/toolchain/bin/arm-openwrt-linux-muslgnueabi-gcc -I /home/Evenurs/f1c100s/dev/f1c100s/tina/out/c200s-F1C200s/compile_dir/target/qrencode-3.4.4/ qrencode.c -o qrencode -L /home/Evenurs/f1c100s/dev/f1c100s/tina/out/c200s-F1C200s/compile_dir/target/qrencode-3.4.4/.libs -lqrencode 

编译通过:

arm-openwrt-linux-muslgnueabi-gcc.bin: warning: environment variable 'STAGING_DIR' not defined
arm-openwrt-linux-muslgnueabi-gcc.bin: warning: environment variable 'STAGING_DIR' not defined
arm-openwrt-linux-muslgnueabi-gcc.bin: warning: environment variable 'STAGING_DIR' not defined

3.3通过adb烧录

通过adb push的方法烧录,详细步骤可参考:

【adb】adb push命令 向设备传输文件icon-default.png?t=N7T8https://evenurs.blog.csdn.net/article/details/128940198?spm=1001.2014.3001.5502

3.4运行

root@TinaLinux:/# chmod -R 777 ./qrencode
root@TinaLinux:/# ./qrencode
QR code generated and saved as qrcode.png.
root@TinaLinux:/# ls
bin          lib          pseudo_init  rom          tmp
dev          mnt          qrcode.png   root         usr
etc          overlay      qrencode     sbin         var
hello        proc         rdinit       sys          www
root@TinaLinux:/#

3.5将qrcode.png通过adb pull导出到电脑

查看数据:

确认是像素颜色数据,只是由于没有文件配置的头数据,会导致文件无法被打开与识别。

四、结论

通过libqrencode库,的确可以将数据转为二维码图片数据,图片数据转成图片则需要借助其他工具实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/411989.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Facebook广告优化

通过Facebook广告优化来提高产品销量&#xff0c;以下是一些步骤和技巧&#xff1a; 1、确定目标受众&#xff1a;在Facebook广告平台上&#xff0c;您可以根据性别、年龄、地理位置、兴趣爱好等多种因素来定义您的目标受众。通过细分目标受众&#xff0c;您可以更精准地将广告…

[足式机器人]Part2 Dr. CAN学习笔记- Kalman Filter卡尔曼滤波器Ch05

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记 - Kalman Filter卡尔曼滤波器 Ch05 1. Recursive Algirithm 递归算法2. Data Fusion 数据融合Covarince Matrix协方差矩阵State Space状态空间方程 Observation观测器3. Step by step : Deriatio…

jmeter-线程数设置为1,循环10次没问题,循环100次出现异常

一、多次尝试&#xff0c;发现出现异常的接口大致相同。 解决办法&#xff1a;在第一个出现异常的接口下添加超时时间&#xff0c;固定定时器&#xff1a;2000ms&#xff0c;再次运行就没问题了。 二、压力机自身存在的问题 1&#xff09;在网络编程中&#xff0c;特别是在短…

查找国外文献的技巧

文章目录 一、方法二、配置参考 一、方法 xrelay&#xff08;1年&#xff09; 其他手段&#xff1a; 手段1手段2 需要自己去看怎么配置 二、配置 google浏览器走代理的配置&#xff1a; 配置步骤&#xff1a; 方法1&#xff1a;https://steemit.com/cn/causenet/7-switc…

Axure全面指南:正确打开并高效使用的步骤!

AxureRP是目前流行的设计精美的用户界面和交互软件。AxureRP根据其应用领域提供了一组丰富的UI控制。作为Axure的国内替代品&#xff0c;即时设计可以在线协作&#xff0c;浏览器可以在无需下载客户端的情况下打开和使用。如果以前使用Axure&#xff0c;很容易切换到即时设计。…

x-www-form-urlencoded接收方式代码示例

数据回推方式是 “x-www-form-urlencoded”&#xff0c;可以选择使用 GET 或 POST 方法来接收数据回推。 使用 GET 方法接收数据回推时&#xff0c;您可以将数据作为查询参数附加在请求的 URL 中。例如&#xff1a; http://example.com/callback?param1value1&param2val…

2024年甘肃省职业院校技能大赛信息安全管理与评估 样题一 模块一

竞赛需要完成三个阶段的任务&#xff0c;分别完成三个模块&#xff0c;总分共计 1000分。三个模块内容和分值分别是&#xff1a; 1.第一阶段&#xff1a;模块一 网络平台搭建与设备安全防护&#xff08;180 分钟&#xff0c;300 分&#xff09;。 2.第二阶段&#xff1a;模块二…

STL中的map

概述 std::map 是一个模板类&#xff0c;定义在头文件 <map> 中&#xff1a; template<class Key,class T,class Compare std::less<Key>,class Allocator std::allocator<std::pair<const Key, T>> > class map;std::map 是一种有序关联容器…

基于SSM的个性化旅游攻略定制系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

不想花钱的年轻人,把盒马逼成了折扣店

「核心提示」 无论是“中产标配”盒马&#xff0c;还是传统超市巨头永辉&#xff0c;都在2023年表达了“低价”的决心。线下比线上还要便宜&#xff0c;为什么仍然有消费者不满意&#xff1f;折扣化转型之后&#xff0c;盒马们还能赚钱吗&#xff1f; 前不久&#xff0c;盒马…

跨境电商行业洞察:未来3大趋势将如何影响跨境商城源码开发

随着全球数字化程度的不断提升和全球贸易的日益频繁&#xff0c;跨境电商行业逐渐成为了全球贸易的重要组成部分。据统计数据显示&#xff0c;跨境电商交易量年复合增长率超过20%&#xff0c;市场潜力被进一步激发。同时&#xff0c;全球各国家和地区都在加速跨境电商领域的相关…

SSH隧道技术

SSH隧道 简介 SSH隧道是一种通过SSH协议在两个网络节点之间建立安全通信的技术。它可以用于多种用途&#xff0c;包括加密和保护敏感数据传输、绕过防火墙限制、远程访问内部服务等。 应用&#xff1a; 端口转发&#xff1a;SSH隧道可以将本地端口转发到远程主机上&#xf…