Python实现对二维码数据进行压缩

作者:神奇代码在哪里_ 时间:2022-10-22 12:51:59 

前言

当前二维码的应用越来越广泛,包括疫情时期的健康码也是应用二维码的典型案例,最近需要通过一张二维码显示较多文本数据,也就是对二维码数据进行压缩,使用CSDN搜索了半天居然没有能简单使用的代码,很多事例代码解决不了字符编码、中文乱码等常见问题。因此只能自己研究了。

本文的目标很明确,就是使用python,实现一张二维码显示更多信息,代码简单实用,不乱码,支持中文,copy就能运行,支持txt、doc、wps、docx、xls、xlsx、pdf、gif、jpg、png、mp4、avi、mp3等所有文件格式,压缩、生成、读取二维码一个py文件实现。

以下是程序的代码文件结构,尽量简单易用。

Python实现对二维码数据进行压缩

一、二维码数据的压缩和写入

1.读取二进制文件数据

使用二进制文件,避免了由于字符编码导致的各种问题,很多博客中的事例代码对中文支持很不友好,导致经常出现乱码、截断等问题,所以文本的数据源使用二进制代码尽量避开文字编码问题。下图是待压缩进二维码的一个txt文档,当然还可以是pdf、word、excel等文件。

Python实现对二维码数据进行压缩

代码如下:

# 使用二进制模式读取以_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)

程序运行后结果如下图:

Python实现对二维码数据进行压缩

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")

程序运行后,二维码图片保存位置如下图:

Python实现对二维码数据进行压缩

打开二维码如下:

Python实现对二维码数据进行压缩

二、读取压缩后的二维码数据

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)

程序运行后的识别结果如下图,可以发现前后数据是一致的。

Python实现对二维码数据进行压缩

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实现对二维码数据进行压缩

三、完整源代码

完整的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,二维码,数据,压缩
0
投稿

猜你喜欢

  • Python 40行代码实现人脸识别功能

    2022-09-30 09:58:35
  • 如何在MySQL数据库中使用XML数据

    2009-12-29 10:48:00
  • jupyter notebook 恢复误删单元格或者历史代码的实现

    2022-03-03 16:13:45
  • Django权限控制的使用

    2023-12-27 01:50:57
  • PHP levenshtein()函数用法讲解

    2023-06-01 15:20:29
  • asp任何取得多个表单的值

    2008-04-15 15:31:00
  • Python 函数list&read&seek详解

    2022-02-14 03:04:21
  • 深入讨论Python函数的参数的默认值所引发的问题的原因

    2022-08-03 00:54:31
  • python list等分并从等分的子集中随机选取一个数

    2022-07-06 05:24:04
  • Python实现获取汉字偏旁部首的方法示例【测试可用】

    2022-10-26 16:42:16
  • python中global用法实例分析

    2023-09-16 08:33:47
  • 使用python编写简单计算器

    2023-08-27 17:07:46
  • cookies应对python反爬虫知识点详解

    2023-12-16 06:15:18
  • 对python中的装包与解包实例详解

    2022-05-08 11:57:59
  • matplotlib.pyplot.matshow 矩阵可视化实例

    2022-01-04 02:57:21
  • Django实现auth模块下的登录注册与注销功能

    2022-03-06 17:49:15
  • python pycharm的安装及其使用

    2023-11-04 20:27:06
  • Python3 pyecharts生成Html文件柱状图及折线图代码实例

    2022-03-17 01:01:46
  • 基于JS实现动态跟随特效的示例代码

    2023-06-30 11:15:16
  • 浅谈PHP中常用的3种设计模式

    2023-10-18 06:23:02
  • asp之家 网络编程 m.aspxhome.com