python 压缩文本内容并生成二维码

单文本压缩并生成二维码

需求: 对文本内容进行压缩,并生成二维码,二维码中包含压缩后的文本内容。解码时,对二维码中的内容进行解压缩,还原文本内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import zlib
import base64
import qrcode
from PIL import Image


def compress_text():
# 要压缩的文本
text = """
这是一个需要压缩并生成二维码的文本内容。
"""

# 压缩文本
compressed_data = zlib.compress(text.encode('utf-8'))

# 将压缩后的二进制数据编码为 Base64 字符串(方便二维码存储)
compressed_base64 = base64.b64encode(compressed_data).decode('utf-8')

# 生成二维码
qr = qrcode.QRCode(
version=1, # 控制二维码的大小,范围是 1 到 40。值越大,二维码的尺寸越大。
error_correction=qrcode.constants.ERROR_CORRECT_L, #
'''
error_correction: 容错率,支持 4 个级别:
ERROR_CORRECT_L: 约 7% 的错误可以纠正。
ERROR_CORRECT_M: 约 15% 的错误可以纠正(默认)。
ERROR_CORRECT_Q: 约 25% 的错误可以纠正。
ERROR_CORRECT_H: 约 30% 的错误可以纠正。
'''
box_size=10, # 每个“盒子”的像素大小
border=4, # 二维码边框的宽度(单位为盒子数
)
qr.add_data(compressed_base64) # 将 Base64 字符串添加到二维码
qr.make(fit=True)

# 创建二维码图像
img = qr.make_image(fill_color="black", back_color="white")

# 保存二维码图像
img.save("compressed_qr.png")

# 显示二维码图像
img.show()

print("二维码已生成并保存为 compressed_qr.png")


def decompress_text():
# 假设这是从二维码中扫描得到的 Base64 字符串
scanned_base64 = "eJyNVMlO20AYvvsprPQQR6GmSClFSD6wqaJFMg1UUU/WxJk408R2MnYAcaOtSigQOFCWplWR2lKqAkUIsSVKXsZLeuIVOl6SQBapPo2/mf//vn+lkJxVsU4vZlCc8s9xoMHBSOMvh0U1AakkVmV6enKK9uFJGUiQoqgETNKiKmcx1DRBhws6ExqmaPI9oOsHS2Zx1a78sj+9s7aXrc9HlH/jwT7mQA0PMCEkgA5ozhXENmDGccxCxVHCBPN68uFQMBRqejt97zk0N4uEyrhZq9dKZuHC+nhqrZ/YlW17f8m4uqFH3bho83jHPjowrs5uKwVr+9qo1oiFXT4nr8zjXfPN4W1lpV2UlxIiyzuw8cGIr6ZNeYhNwHsqGyLtra9WYbPJ5KI5TDx6+WVfRMccMxd3vjmINaQq3EBfE4IYq1gQVYyhqDt3vqmoKpoOFF1jJ6JRPiqM8dHoxNisMNUyjasLgoYWITfw6C6IExBzEQ8J+ZJYkPBCYTriD/nZ7sikdVk2P+ybhdP2+FgZpCGTRDo3i/OwVbFCySzftNJeqppvN9w7JEtuTlxDATlNRswzGRJ2RsVcIJ4BYjrQR+ogphvYfArpMNB0btS+kDr2cM5qYA4ygTuhEa6sIrXMrd2q/b2XNlZLqfOM/zaLkaIzgdbTyzOvyub1hS+CdF1XKndsnE7pOjjm0nL9pFqv7Vm7f4xysUlgXB1bK7+tjQ2zukOSTXq9oxKuB00EinK3awPw2fzo9Mj4eH8Y9csQvMLhmYjEz0RyeVmUeBIYjPEoDIdyMPZYz8OXShhMpvmZwdc8fKLzUJIgBCkexFJhIGI+9jQFY/k85EckxMPnSpoLuPNe2/u7vGaXzq3iD3vr0LheNVfWvYx0ldpYEz+/kdg6rknu2ia5x6ZojaQ/evfD77k2CK+3NrrRqBhJSAEZtzKNddQq2H+Ovd8hTSZvQXl7b5h08T0Wpy1QkhYEBchQEGiOo4OCIAOkCELQa42OjvFo/gEUIGjR" # 这里直接用之前生成的 Base64 字符串

# 解码 Base64 字符串为二进制数据
compressed_data = base64.b64decode(scanned_base64.encode('utf-8'))

# 解压缩二进制数据
original_text = zlib.decompress(compressed_data).decode('utf-8')

print("解压缩后的文本:", original_text)


if __name__ == '__main__':
compress_text()
decompress_text()

长文本分片压缩并生成二维码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import zlib
import base64
import qrcode
from PIL import Image


def compress_text():
# 要压缩的长文本
long_text = """
这是一个需要压缩并生成二维码的长文本内容。
"""

# 压缩文本
compressed_data = zlib.compress(long_text.encode('utf-8'))
print("压缩后的二进制数据:", compressed_data)
# 将压缩后的二进制数据分块(每块最大 2953 字节,适合二维码存储)
chunk_size = 2200 # 二维码最大容量约为 3KB,Base64 编码后会略微增加
chunks = [compressed_data[i:i + chunk_size] for i in range(0, len(compressed_data), chunk_size)]

# 生成二维码
for i, chunk in enumerate(chunks):
# 将二进制数据编码为 Base64 字符串
chunk_base64 = base64.b64encode(chunk).decode('utf-8')

# 添加块信息(例如:块编号/总块数)
chunk_info = f"{i + 1}/{len(chunks)}:{chunk_base64}"
# print(f"生成二维码块 {i + 1}:", chunk_info)
# 创建二维码对象
qr = qrcode.QRCode(
version=40, # 最大版本(40)
error_correction=qrcode.constants.ERROR_CORRECT_L, # 容错率
box_size=10,
border=4,
)
qr.add_data(chunk_info)
qr.make(fit=True)

# 生成二维码图像
img = qr.make_image(fill_color="black", back_color="white")

# 保存二维码图像
img.save(f"qr_chunk_{i + 1}.png")
print(f"二维码块 {i + 1} 已保存为 qr_chunk_{i + 1}.png")

print("所有二维码已生成。")

def decompress_text():
# 假设这是从二维码中扫描得到的 Base64 字符串列表
scanned_base64_list = [
"1/2:eJzT0yMAAGTvBe8=", # 示例 Base64 字符串(块 1/2)
"2/2:eJzT0yMAAGTvBe9=", # 示例 Base64 字符串(块 2/2)
]

# 按块编号排序
scanned_base64_list.sort(key=lambda x: int(x.split(":")[0].split("/")[0]))

compressed_data = b''
for i, chunk in enumerate(scanned_base64_list):
chunk_base64 = chunk.split(":")[1]

# 解码 Base64 字符串为二进制数据
compressed_chunk = base64.b64decode(chunk_base64.encode('utf-8'))

compressed_data += compressed_chunk

# 解压缩二进制数据
original_text = zlib.decompress(compressed_data).decode('utf-8')
print("解压缩后的文本:", original_text)

# 保存解压缩后的文本(如果解码后的数据较大,某些环境(如终端或日志)可能会自动截断输出)
with open("output_file.txt", "w", encoding='utf-8') as f:
f.write(original_text)

if __name__ == '__main__':
compress_text()
decompress_text()