Python实现对二维码数据进行压缩
作者:神奇代码在哪里_ 发布时间:2022-10-22 12:51:59
前言
当前二维码的应用越来越广泛,包括疫情时期的健康码也是应用二维码的典型案例,最近需要通过一张二维码显示较多文本数据,也就是对二维码数据进行压缩,使用CSDN搜索了半天居然没有能简单使用的代码,很多事例代码解决不了字符编码、中文乱码等常见问题。因此只能自己研究了。
本文的目标很明确,就是使用python,实现一张二维码显示更多信息,代码简单实用,不乱码,支持中文,copy就能运行,支持txt、doc、wps、docx、xls、xlsx、pdf、gif、jpg、png、mp4、avi、mp3等所有文件格式,压缩、生成、读取二维码一个py文件实现。
以下是程序的代码文件结构,尽量简单易用。
一、二维码数据的压缩和写入
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()
程序运行后生成的文件如下图:
可以看到还原后的文件和压缩前是一致的。
三、完整源代码
完整的Python源代码
以下是完整的python代码,后续继续优化改进。
import zlib
import base64
import qrcode
import cv2
from pyzbar import pyzbar
def 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_data
if __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()
来源:https://blog.csdn.net/qq616491978/article/details/129023196


猜你喜欢
- 前言最近几天,研究了一下一直很好奇的爬虫算法。这里写一下最近几天的点点心得。下面进入正文:你可能需要的工作环境:Python 3.6官网下载
- 代码如下:--PK select * from sys.key_constraints where object_id = OBJECT_
- 关于yii2配置操作多个数据库进行操作,文档上面也给出了具体的配置,一个实战性的例子,也是很简单的,我们这里以权限控制为单个管理库dbnam
- Python注释python中单行注释采用 # 开头。python 中多行注释使用三个单引号(''')或三个双引号(
- 一、多项式拟合多项式拟合的话,用的的是numpy这个库的polyfit这个函数。那么多项式拟合,最简单的当然是,一次多项式拟合了,就是线性回
- 概论在讨论ECMAScript闭包之前,先来介绍下函数式编程(与ECMA-262-3 标准无关)中一些基本定义。 然而,为了更好的解释这些定
- 写在前面题目所说的并不是目的,主要是为了更详细的了解网站的反爬机制,如果真的想要提高博客的阅读量,优质的内容必不可少。了解网站的反爬机制一般
- 之前总结过flask里的基础知识,现在来总结下flask里的前后端数据交互的知识,这里用的是Ajax一、 post方法1、post方法的位置
- 1. 导入各种模块基本形式为:import 模块名from 某个文件 import 某个模块2. 导入数据(以两类分类问题为例,即numCl
- 在Windows系统中用“Ctrl+C”和“Ctrl+V”就可以完成复制、粘贴工作,是不是很爽?其实使用a标签的accesskey属性也可以
- 前言对MySQL表的基本查询还远远达不到实际开发过程中的需求,因此还需要掌握对数据库表的复合查询。本文介绍了多表查询、子查询、自连接、内外连
- 哎~工作忙死了!!!!!!今天在百度老年看到一个手写输入法,颇感新鲜。so把其框下!请不要用在商业用途,学习之用,版权百度所有。看代码!注:
- function siblings(o){//参数o就是想取谁的兄弟节点,就把那个元素传进去 var a=[];//定义一个数组,用来存o的
- <1>IsArray 函数 返回 Boolean 值指明某变量是否为数组。 语法 IsArray(var
- 简介本文主要通过探究在golang 中map的数据结构及源码实现来学习和了解map的特性,共包含map的模型探究、存取、扩容等内容。欢迎大家
- Dataframe使用loc取某几行几列的数据:print(df.loc[0:4,['item_price_level',&
- #/usr/bin/env/python#coding=utf-8import sys,re,time,osmaxdata = 50000
- python文件I/O打印到屏幕:最简单的输出方法是用print语句,你可以给它传递零个或多个用逗号隔开的表达式。读取键盘输入:Python
- 大部分数据库管理员拥有某种形式的数据库元数据库,他们依赖其来跟踪范围很广的Microsoft SQL Server环境。我利用连接的服务器和
- 本文为大家分享了mysql8.0.13安装图文教程,供大家参考,具体内容如下1.1. 下载:我下载的是64位系统的zip包:下载地