二维码数据压缩实践 | 使用python对二维码数据进行压缩 |不乱码,支持中文
当前二维码的应用越来越广泛,包括疫情时期的健康码也是应用二维码的典型案例,最近需要通过一张二维码显示较多文本数据,也就是
对二维码数据进行压缩
,使用CSDN搜索了半天居然没有能简单使用的代码,很多事例代码解决不了字符编码
、中文乱码
等常见问题。因此只能自己研究了。
本文的目标很明确,就是使用python,实现
一张二维码显示更多信息
,代码简单实用,不乱码
,支持中文
,copy就能运行
,支持txt、doc、wps、docx、xls、xlsx、pdf、gif、jpg、png、mp4、avi、mp3等所有文件格式
,压缩、生成、读取二维码一个py文件实现。
以下是程序的代码文件结构,尽量简单易用。
二维码数据压缩实践 | 使用python对二维码数据进行压缩
- 一、二维码数据的压缩和写入
- 1.读取二进制文件数据
- 2.压缩二进制文件数据
- 3.使用base64对压缩后的二进制文件数据进行编码
- 4.将编码后的数据写入二维码
- 二、读取压缩后的二维码数据
- 1.识别二维码图片并读取数据
- 2.使用base64对读取的数据进行解码
- 3.解压解码后数据
- 4.还原文件数据
- 三、完整源代码
- 1.完整的Python源代码
- 2.完整的Python源代码下载地址
一、二维码数据的压缩和写入
1.读取二进制文件数据
使用二进制文件,避免了由于字符编码导致的各种问题,很多博客中的事例代码对中文支持很不友好,导致经常出现乱码、截断等问题,所以文本的数据源使用二进制代码尽量避开文字编码问题。下图是待压缩进二维码的一个txt文档
,当然还可以是pdf、word、excel等文件。
代码如下:
# 使用二进制模式读取以_file_path为路径的文件_file = open(_file_path, mode="rb")_contents = _file.read()
2.压缩二进制文件数据
使用zlib.compress()
方法对二进制数据进行压缩。
# 对数据进行压缩_contents_zip = zlib.compress(_contents, zlib.Z_BEST_COMPRESSION)
3.使用base64对压缩后的二进制文件数据进行编码
使用base64编码
可以避免很多编码转换问题,而且base64编码
都是由英文字符组成,非常方便程序员调试和对比前后数据是否一致。
# 转换为_base64格式方便数据传输_contents_base64 = base64.b64encode(_contents_zip)_temp_str_utf8 = _contents_base64.decode('utf-8')print("压缩进二维码的base64编码为:%s" % _temp_str_utf8)
程序运行后结果如下图:
4.将编码后的数据写入二维码
创建QRCode
对象后,可使用.add_data()
方法向二维码加入数据,确认数据全部加入后使用.make_image()
在内存中生成二维码,最后使用.save()
就可以保存二维码图片到电脑指定位置。
# 创建QRCode对象_qr = qrcode.QRCode()# 向二维码添加数据_qr.add_data(_temp_str_utf8, 0)# 生成二维码并保存_image = _qr.make_image()_image.save("compress_qrcode.png")
程序运行后,二维码图片保存位置如下图:
打开二维码如下:
二、读取压缩后的二维码数据
1.识别二维码图片并读取数据
使用python的pyzbar
库即可实现二维码的识别,如果发现pyzbar
识别不了那就需要使用opencv
相关库对图片进行处理,提高识别的准确性,这里就不展开研究opencv
处理图像的内容了。
# 读取图片对象_image = cv2.imread(_file_path)# 使用pyzbar解析二维码中的数据_qr_data = pyzbar.decode(_image)
2.使用base64对读取的数据进行解码
# 识别二维码并解压缩return_data = read_compress_qrcode("compress_qrcode.png")base64_data = return_data[0].data.decode("utf-8")print("读取并解码后的base64编码为:%s" % base64_data)# 解码base64数据bytes_data = base64.b64decode(base64_data)
程序运行后的识别结果如下图,可以发现前后数据是一致的。
3.解压解码后数据
使用zlib.decompress()
进行解压。
# 解压数据unzip_bytes_data= zlib.decompress(bytes_data)
4.还原文件数据
使用二进制写方式wb
打开文件,把数据重新写入并保存。
# 还原压缩文件,使用二进制方式写入文件with open("还原后的文件.txt", 'wb') as f:f.write(unzip_bytes_data)f.close()
程序运行后生成的文件如下图:
可以看到还原后的文件和压缩前是一致的。
三、完整源代码
1.完整的Python源代码
以下是完整的python代码,后续继续优化改进。
import zlib
import base64
import qrcode
import cv2
from pyzbar import pyzbardef compress_qrcode(_file_path):"""把二进制文件压缩进二维码的函数:param _file_path: 待压缩进二维码的文件路径:return: 无"""# 使用二进制模式读取以_file_path为路径的文件_file = open(_file_path, mode="rb")_contents = _file.read()# 对数据进行压缩_contents_zip = zlib.compress(_contents, zlib.Z_BEST_COMPRESSION)# 转换为_base64格式方便数据传输_contents_base64 = base64.b64encode(_contents_zip)_temp_str_utf8 = _contents_base64.decode('utf-8')print("压缩进二维码的base64编码为:%s" % _temp_str_utf8)# 创建QRCode对象_qr = qrcode.QRCode()# 向二维码添加数据_qr.add_data(_temp_str_utf8, 0)# 生成二维码并保存_image = _qr.make_image()_image.save("compress_qrcode.png")def read_compress_qrcode(_file_path):# 读取图片对象_image = cv2.imread(_file_path)# 使用pyzbar解析二维码中的数据_qr_data = pyzbar.decode(_image)# 返回读取的数据return _qr_dataif __name__ == '__main__':# 压缩并生成二维码compress_qrcode("待压缩进二维码的文件.txt")# 识别二维码并解压缩return_data = read_compress_qrcode("compress_qrcode.png")base64_data = return_data[0].data.decode("utf-8")print("读取并解码后的base64编码为:%s" % base64_data)# 解码base64数据bytes_data = base64.b64decode(base64_data)# 解压数据unzip_bytes_data= zlib.decompress(bytes_data)# 还原压缩文件,使用二进制方式写入文件with open("还原后的文件.txt", 'wb') as f:f.write(unzip_bytes_data)f.close()
2.完整的Python源代码下载地址
下载地址:
二维码数据压缩源码|https://download.csdn.net/download/qq616491978/87450899
相关文章:

二维码数据压缩实践 | 使用python对二维码数据进行压缩 |不乱码,支持中文
当前二维码的应用越来越广泛,包括疫情时期的健康码也是应用二维码的典型案例,最近需要通过一张二维码显示较多文本数据,也就是对二维码数据进行压缩,使用CSDN搜索了半天居然没有能简单使用的代码,很多事例代码解决不了…...

C语言学习_DAY_3_基本数据类型_运算符与表达式【C语言学习笔记】
目录 I. 基本数据类型 II. 复杂的输出和输入语句编写 III. 运算符与表达式 III.I 算术运算符 III.II 关系运算符 III.III 逻辑运算符 III.IV 位运算符 III.V 三目运算符 III.VI 逗号运算符 高质量博主,点个关注不迷路🌸🌸dz…...
c++练习题(4)
题号:1 设int a3,b2;则a*b的结果是() A、2 B、7 C、3 D、8 题号:2 一个程序单位中不包括以下哪项() A、伪代码 B、函数 C、预处理指令 D、全局声明 题号:3 若a-14,…...

腾讯云 cos 字体在CDN上跨域处理
问题描述:项目中用到了字体的静态资源,把静态资源放到了腾讯云对象存储提供的 COS 上,同时启用它的CDN来加速。但是,调试的过程中发现报错:CSS加载字体跨域了,字体图标无法正常显示。 原因:字体…...

api是什么意思?又该如何使用呢?
一、应用程序编程接口 API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。 API全称 "…...

JavaScript------面向对象
目录 一、面向对象编程(OOP) 基本概念 二、类 1、语法 2、通过类创建对象 3、类的属性 4、类的方法 5、构造函数 三、面向对象的三个特点 1、封装 如何确保数据的安全(实现封装的方式): 2、继承 在子类中&a…...

charles+夜神模拟器抓包
1.资料地址: 链接:https://pan.baidu.com/s/1w9qYfFPJcduN4If50ICccw 提取码:a7xa2.安装charles 和夜神模拟器并配置参考地址: https://www.beierblog.com/archives/%E4%BA%B2%E6%B5%8B%E5%AE%8C%E5%85%A8%E5%8F%AF%E8%A1%8Ccharles%E6%8A%93%E5%8C%85%E…...

【STC15单片机】模拟I2C操作AT24C02数据读取【更新中】
目录 I2C时序结构 I2C代码 AT24C02代码(继承I2C底层代码) PCF8591 PCB上线的长短可能影响数据传输的时间,写I2C时序可能就要加一点延时 I2C时序结构 起始条件:SCL高电平期间,SDA从高电平切换到低电平终止条件&…...
Hadoop
Hadoop Hadoop1.x 2.x 3.x区别 Hadoop1.x组成:MapReduce负责计算和资源调度,HDFS负责数据存储,Common辅助工具。 Hadoop2.x组成:MapReduce负责计算,Yarn负责资源调度,HDFS负责数据存储,Commo…...
ArrayList源码+扩容机制分析
1. ArrayList 简介 ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增长。在添加大量元素前,应用程序可以使用ensureCapacity操作来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量。 ArrayLis…...

数据库(第四次作业)
学生表:Student (Sno, Sname, Ssex , Sage, Sdept) 学号,姓名,性别,年龄,所在系 Sno为主键 课程表:Course (Cno, Cname,) 课程号,课程名 Cno为主键 学生选课表:SC (Sno, Cno, Score)…...
传统档案管理,为什么影响企业上市进度?
企业上市,对于很多创业者来说,是他们奋发努力的首要目标。企业通过上市,进行股权融资,扩大经营规模,加速促进公司成长,最终达到企业的可持续发展。而要实现成功上市,企业除了需要满足股份公司上…...

9个EXCEL舍入函数公式的用法和实例
用法和实例 1. ROUND ROUND函数可以将数字四舍五入到指定的小数位数。 语法:ROUND(number, num_digits) number:要四舍五入的数字。 num_digits:要保留的小数位数。 举例: ROUND(3.14159,2),结果为3.14 ROUND(3.141…...
设计模式:代理模式给原始类附加功能
一、代理模式 1、定义 在不改变原始类(被代理类)的情况下,通过引入代理类来给原始类附加功能。 一般情况下,让代理类和原始类实现同样的接口。 但是,如果原始类并没有定义接口,并且原始类代码并不是我们…...

JavaScript刷LeetCode拿offer-链表篇
一、链表 链表(Linked List)是一种常见的基础数据结构,也是线性表的一种。 一个线性表是 n 个具有相同特性的数据元素的有限序列,线性表的存储结构分为两类:顺序表(数组)和链表。 链表相比较顺…...

CPP2022-28-期末模拟测试01
6-1 实现一个计算三角形面积的简单函数(假设输入的边长合理)。 分数 10 全屏浏览题目 切换布局 作者 王和兴 单位 东北大学秦皇岛分校 实现一个计算三角形面积的简单函数(假设输入的边长合理)。 函数接口定义: do…...

牛客网Python篇数据分析习题(五)
1.现有牛客网12月每天练习题目的数据集nowcoder.csv。包含如下字段(字段之间用逗号分隔): user_id:用户id question_id:问题编号 result:运行结果 date:练习日期 请你统计答对和答错的总数分别是多少。 imp…...
华为OD机试真题JAVA实现【人数最多的站点】真题+解题思路+代码(20222023)
🔥系列专栏 华为OD机试(JAVA)真题目录汇总华为OD机试(Python)真题目录汇总华为OD机试(C++)真题目录汇总华为OD机试(JavaScript)真题目录汇总文章目录 🔥系列专栏题目输入输出示例一输入输出说明解题思路核心知识点Code运行结果版权说...

ROS2机器人编程简述humble-第四章-IMPROVED DETECTOR .4
ROS2之TF2小练习-颜色随机器人和障碍物直接距离变化ROS2之TF2小练习-有哪些bug找找看里面给出了:ROS2机器人编程简述humble-第四章-BASIC DETECTOR .3需要改进哪些地方呢?检测之后,距离不变了……如何变化?这个问题可以问chatgpt吗…...
依存句法分析 -- tag和dep释义
依存句法分析(Dependency Parsing, DP)是通过分析语言单位内成分之间的依存关系揭示其句法结构,主张橘子 中核心动词是支配其它成分的中心成分,而它本身却不受其他任何成分的支配,所有受支配成分都以某种关系从属于支配…...

IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...

短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...