二维码数据压缩实践 | 使用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)是通过分析语言单位内成分之间的依存关系揭示其句法结构,主张橘子 中核心动词是支配其它成分的中心成分,而它本身却不受其他任何成分的支配,所有受支配成分都以某种关系从属于支配…...
服务器常见的网络攻击以及防御方法
网络安全威胁类别 网络内部的威胁,网络的滥用,没有安全意识的员工,黑客,骇客。 木马攻击原理 C/S 架构,服务器端被植入目标主机,服务器端通过反弹连接和客户端连接。从而客户端对其进行控制。 病毒 一…...
Python期末复习知识点大合集(期末不挂科版)
Python期末复习知识点大合集(期末不挂科版) 文章目录Python期末复习知识点大合集(期末不挂科版)一、输入及类型转换二、格式化输出:字符串的format方法三、流程控制四、随机数生成五、字符串六、序列索(含字…...
Echarts 雷达图设置拐点大小和形状,tooltip后文字不居中对齐
第017个点击查看专栏目录Echarts的雷达图的拐点大小和形状是可以设置的,在series中设置symbol 相应的属性即可。 使用tooltip的时候,默认状态文字是居中对齐的,不好看。需要在tooltip属性中设置一下,如图所示,效果比较…...
Lesson 7.1 无监督学习算法与 K-Means 快速聚类
文章目录一、聚类算法与无监督学习二、K-Means 快速聚类的算法原理1. K-Means 快速聚类的基本执行流程2. K-Means 快速聚类的背后的数学意义三、K-Means 快速聚类的 sklearn 实现方法1. sklearn 中实现 K-Means 快速快速聚类2. 轮廓系数基本概念与 sklearn 中实现方法从现在开始…...
优维低代码:Legacy Templates 构件模板
优维低代码技术专栏,是一个全新的、技术为主的专栏,由优维技术委员会成员执笔,基于优维7年低代码技术研发及运维成果,主要介绍低代码相关的技术原理及架构逻辑,目的是给广大运维人提供一个技术交流与学习的平台。 连载…...
最全面的SpringBoot教程(五)——整合框架
前言 本文为 最全面的SpringBoot教程(五)——整合框架 相关知识,下边将对SpringBoot整合Junit,SpringBoot整合Mybatis,SpringBoot整合Redis等进行详尽介绍~ 📌博主主页:小新要变强 的主页 &…...
信息安全保障
信息安全保障信息安全保障基础信息安全保障背景信息安全保障概念与模型基于时间的PDR模型PPDR模型(时间)IATF模型--深度防御保障模型(空间)信息安全保障实践我国信息安全保障实践各国信息安全保障我国信息安全保障体系信息安全保障…...
windows/linux,mosquitto插件mosquitto-auth-plug说明,重点讲解windows下
先贴代码,再讲方法 #ifndef AUTH_PLUG_H #define AUTH_PLUG_H#ifdef _WIN32 #ifdef AUTH_PLUG_EXPORTS # define AUTH_PLUG_AP...
GWAS:mtag (Multi-Trait Analysis of GWAS) 分析
mtag (Multi-Trait Analysis of GWAS)作用:通过对多个表型相似的GWAS summary结果进行联合分析,发现更多的表型相关基因座。 以抑郁症状、神经质和主观幸福感这三个表型为例,分别对他们进行GWAS分析,鉴定得到32、9 和 13个基因座与…...
MATLAB--imadjust函数
目录 一、功能 二、使用 1.格式 2.具体用法 3.代码 总结 一、功能 功能:通过灰度变换调整对比度 二、使用 1.格式 Jimadjust(I,[low high],[bottom top],gamma)2.具体用法 将图像I中的灰度值映射到J中的新值,即将灰度在[low high]之间的值映射到…...
网站后台插件/十大营销案例分析
什么是数据库的事务 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界…...
做姓氏图的网站/七牛云
来源 | 腾讯知乎专栏作者 | AIoys(腾讯员工,后台工程师)项目文档和代码在此:github项目地址▌一、前言阅读本文的基础:我会认为你对BP神经网络有充分的了解,熟读过我上一篇文章,本文会大量引用上…...
wordpress 443端口/谷歌平台推广外贸
原文 如何将经纬度利用Google Map API显示C# VS2005 Sample Code 日前写了一篇如何用GPS抓取目前所在,并回传至资料库储存,这篇将会利用这些回报的资料,将它显示在地图上,这个做法有两种,最简单的就是直接传值到Google Maps上. 举例来说,当我们知道经纬度后,只要将数据套到以下…...
php如何做音乐网站/网站优化排名软件推广
习题4-10 猴子吃桃问题 (15分) 一只猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。到第N天早上想再吃时…...
做网站配置/最近一周的重大热点新闻
设置父级div为相对位置 设置子级div为绝对位置 代码如下: <!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title></head><body><div style"width: 100%; height: 600px; border:…...
网站设计 网站建设 手机网站建设/百度公司在哪
1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id603672744434 3)全套实验源码手册视频下载地址:http://www.openedv.com/thread-300792-1-1.html 4)…...