前言
当前二维码的应用越来越广泛,疫情时期的健康码就是二维码应用的典型案例。最近,有一个小项目需要在一张二维码中存储大量的文本数据,因此要对文本进行压缩后再生成对应的二维码图片
(压缩二维码数据)
。博主在CSDN上搜索了大半天,始终未能找到简单易用的代码,大量事例代码并不能完全解决字符编码
、中文乱码
等问题。
本文介绍一种经验证可行的压缩方法,用Python代码实现一张二维码显示更多信息,力求做到代码简单实用,
不乱码
,支持中文
,copy就能运行
,支持txt、doc、wps、docx、xls、xlsx、pdf、gif、jpg、png、mp4、avi、mp3等所有文件格式
,压缩、生成、读取二维码使用一个.py文件实现。
程序的代码文件结构如下图👇:
目录
二维码数据压缩实践 | 使用python对二维码数据进行压缩
一、压缩和写入二维码数据
1.读取待压缩文件(二进制)数据
第一步:使用二进制方式读取待压缩文件数据。使用二进制文件,可有效避免字符编码导致的各种奇怪问题,如果直接使用字符串进行压缩和写入,则可能出现不完全支持中文,乱码、文本截断等问题,也是部分博文事例中出现的常见问题。
使用二进制还有一个明显的好处,还可以支持.pdf、.word、.excel、mp3等非结构化文件
的压缩。下图是一个待读取的.txt文档事例。
代码如下:
# 使用二进制模式读取以_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.根据编码后数据生成二维码
第四步:完成base64编码后,再使用qrcode.QRCode()生成二维码。创建
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对读取的数据进行解码
第二步:在第一章中,我们使用了base64对压缩的数据进行了编码,因此在读取压缩数据时,需要使用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)
打开文件,把数据写入后,另存为.txt结尾的文件,并保存。
代码如下:
# 还原压缩文件,使用二进制方式写入文件
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 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()
2.完整的Python源代码下载地址
下载地址:
二维码数据压缩源码|https://download.csdn.net/download/qq616491978/87450899