Python實現(xiàn)對二維碼數(shù)據(jù)進行壓縮
前言
當(dāng)前二維碼的應(yīng)用越來越廣泛,包括疫情時期的健康碼也是應(yīng)用二維碼的典型案例,最近需要通過一張二維碼顯示較多文本數(shù)據(jù),也就是對二維碼數(shù)據(jù)進行壓縮,使用CSDN搜索了半天居然沒有能簡單使用的代碼,很多事例代碼解決不了字符編碼、中文亂碼等常見問題。因此只能自己研究了。
本文的目標(biāo)很明確,就是使用python,實現(xiàn)一張二維碼顯示更多信息,代碼簡單實用,不亂碼,支持中文,copy就能運行,支持txt、doc、wps、docx、xls、xlsx、pdf、gif、jpg、png、mp4、avi、mp3等所有文件格式,壓縮、生成、讀取二維碼一個py文件實現(xiàn)。
以下是程序的代碼文件結(jié)構(gòu),盡量簡單易用。
一、二維碼數(shù)據(jù)的壓縮和寫入
1.讀取二進制文件數(shù)據(jù)
使用二進制文件,避免了由于字符編碼導(dǎo)致的各種問題,很多博客中的事例代碼對中文支持很不友好,導(dǎo)致經(jīng)常出現(xiàn)亂碼、截斷等問題,所以文本的數(shù)據(jù)源使用二進制代碼盡量避開文字編碼問題。下圖是待壓縮進二維碼的一個txt文檔,當(dāng)然還可以是pdf、word、excel等文件。
代碼如下:
# 使用二進制模式讀取以_file_path為路徑的文件 _file = open(_file_path, mode="rb") _contents = _file.read()
2.壓縮二進制文件數(shù)據(jù)
使用zlib.compress()
方法對二進制數(shù)據(jù)進行壓縮。
# 對數(shù)據(jù)進行壓縮 _contents_zip = zlib.compress(_contents, zlib.Z_BEST_COMPRESSION)
3.使用base64對壓縮后的二進制文件數(shù)據(jù)進行編碼
使用base64編碼
可以避免很多編碼轉(zhuǎn)換問題,而且base64編碼
都是由英文字符組成,非常方便程序員調(diào)試和對比前后數(shù)據(jù)是否一致。
# 轉(zhuǎn)換為_base64格式方便數(shù)據(jù)傳輸 _contents_base64 = base64.b64encode(_contents_zip) _temp_str_utf8 = _contents_base64.decode('utf-8') print("壓縮進二維碼的base64編碼為:%s" % _temp_str_utf8)
程序運行后結(jié)果如下圖:
4.將編碼后的數(shù)據(jù)寫入二維碼
創(chuàng)建QRCode
對象后,可使用.add_data()
方法向二維碼加入數(shù)據(jù),確認(rèn)數(shù)據(jù)全部加入后使用.make_image()
在內(nèi)存中生成二維碼,最后使用.save()
就可以保存二維碼圖片到電腦指定位置。
# 創(chuàng)建QRCode對象 _qr = qrcode.QRCode() # 向二維碼添加數(shù)據(jù) _qr.add_data(_temp_str_utf8, 0) # 生成二維碼并保存 _image = _qr.make_image() _image.save("compress_qrcode.png")
程序運行后,二維碼圖片保存位置如下圖:
打開二維碼如下:
二、讀取壓縮后的二維碼數(shù)據(jù)
1.識別二維碼圖片并讀取數(shù)據(jù)
使用python的pyzbar
庫即可實現(xiàn)二維碼的識別,如果發(fā)現(xiàn)pyzbar
識別不了那就需要使用opencv
相關(guān)庫對圖片進行處理,提高識別的準(zhǔn)確性,這里就不展開研究opencv
處理圖像的內(nèi)容了。
# 讀取圖片對象 _image = cv2.imread(_file_path) # 使用pyzbar解析二維碼中的數(shù)據(jù) _qr_data = pyzbar.decode(_image)
2.使用base64對讀取的數(shù)據(jù)進行解碼
# 識別二維碼并解壓縮 return_data = read_compress_qrcode("compress_qrcode.png") base64_data = return_data[0].data.decode("utf-8") print("讀取并解碼后的base64編碼為:%s" % base64_data) # 解碼base64數(shù)據(jù) bytes_data = base64.b64decode(base64_data)
程序運行后的識別結(jié)果如下圖,可以發(fā)現(xiàn)前后數(shù)據(jù)是一致的。
3.解壓解碼后數(shù)據(jù)
使用zlib.decompress()
進行解壓。
# 解壓數(shù)據(jù) unzip_bytes_data= zlib.decompress(bytes_data)
4.還原文件數(shù)據(jù)
使用二進制寫方式wb
打開文件,把數(shù)據(jù)重新寫入并保存。
# 還原壓縮文件,使用二進制方式寫入文件 with open("還原后的文件.txt", 'wb') as f: f.write(unzip_bytes_data) f.close()
程序運行后生成的文件如下圖:
可以看到還原后的文件和壓縮前是一致的。
三、完整源代碼
完整的Python源代碼
以下是完整的python代碼,后續(xù)繼續(xù)優(yōu)化改進。
import zlib import base64 import qrcode import cv2 from pyzbar import pyzbar def compress_qrcode(_file_path): """ 把二進制文件壓縮進二維碼的函數(shù) :param _file_path: 待壓縮進二維碼的文件路徑 :return: 無 """ # 使用二進制模式讀取以_file_path為路徑的文件 _file = open(_file_path, mode="rb") _contents = _file.read() # 對數(shù)據(jù)進行壓縮 _contents_zip = zlib.compress(_contents, zlib.Z_BEST_COMPRESSION) # 轉(zhuǎn)換為_base64格式方便數(shù)據(jù)傳輸 _contents_base64 = base64.b64encode(_contents_zip) _temp_str_utf8 = _contents_base64.decode('utf-8') print("壓縮進二維碼的base64編碼為:%s" % _temp_str_utf8) # 創(chuàng)建QRCode對象 _qr = qrcode.QRCode() # 向二維碼添加數(shù)據(jù) _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解析二維碼中的數(shù)據(jù) _qr_data = pyzbar.decode(_image) # 返回讀取的數(shù)據(jù) 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數(shù)據(jù) bytes_data = base64.b64decode(base64_data) # 解壓數(shù)據(jù) unzip_bytes_data= zlib.decompress(bytes_data) # 還原壓縮文件,使用二進制方式寫入文件 with open("還原后的文件.txt", 'wb') as f: f.write(unzip_bytes_data) f.close()
到此這篇關(guān)于Python實現(xiàn)對二維碼數(shù)據(jù)進行壓縮的文章就介紹到這了,更多相關(guān)Python二維碼數(shù)據(jù)壓縮內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何用Python對數(shù)學(xué)函數(shù)進行求值、求偏導(dǎo)
這篇文章主要介紹了如何用Python對數(shù)學(xué)函數(shù)進行求值、求偏導(dǎo)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05pytorch MSELoss計算平均的實現(xiàn)方法
這篇文章主要介紹了pytorch MSELoss計算平均的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05對python的bytes類型數(shù)據(jù)split分割切片方法
今天小編就為大家分享一篇對python的bytes類型數(shù)據(jù)split分割切片方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12