欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python實現(xiàn)對二維碼數(shù)據(jù)進行壓縮

 更新時間:2023年02月15日 09:27:52   作者:神奇代碼在哪里_  
當(dāng)前二維碼的應(yīng)用越來越廣泛,包括疫情時期的健康碼也是應(yīng)用二維碼的典型案例。本文的目標(biāo)很明確,就是使用python,實現(xiàn)一張二維碼顯示更多信息,代碼簡單實用,感興趣的可以了解一下

前言

當(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)

    這篇文章主要介紹了如何用Python對數(shù)學(xué)函數(shù)進行求值、求偏導(dǎo)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Python判斷兩個對象相等的原理

    Python判斷兩個對象相等的原理

    這篇文章主要介紹了Python判斷兩個對象相等的原理,需要的朋友可以參考下
    2017-12-12
  • python3.X 抓取火車票信息【修正版】

    python3.X 抓取火車票信息【修正版】

    這篇文章主要介紹了python3.X 抓取火車票信息修正版,本文是在源代碼的基礎(chǔ)上進行的修改,需要的朋友可以參考下
    2018-06-06
  • pytorch MSELoss計算平均的實現(xiàn)方法

    pytorch MSELoss計算平均的實現(xiàn)方法

    這篇文章主要介紹了pytorch MSELoss計算平均的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • python實現(xiàn)三次樣條插值

    python實現(xiàn)三次樣條插值

    這篇文章主要為大家詳細介紹了python實現(xiàn)三次樣條插值,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • Python書單 不將就

    Python書單 不將就

    對于學(xué)習(xí)Python語言,如何選擇合適的Python書單,是不是已經(jīng)眼花繚亂,不知道該選擇哪本好了呢?今天我來為大家分享幾本不可錯過的Python好書
    2017-07-07
  • python3操作mysql數(shù)據(jù)庫的方法

    python3操作mysql數(shù)據(jù)庫的方法

    這篇文章主要介紹了python3操作mysql數(shù)據(jù)庫的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Python參數(shù)的傳遞幾種情況實例詳解

    Python參數(shù)的傳遞幾種情況實例詳解

    這篇文章主要給大家介紹了關(guān)于Python參數(shù)的傳遞的相關(guān)資料,在Python中傳遞參數(shù)指的是函數(shù)或方法中的參數(shù)傳輸方式,文中給出了詳細的代碼示例,需要的朋友可以參考下
    2023-09-09
  • 對python的bytes類型數(shù)據(jù)split分割切片方法

    對python的bytes類型數(shù)據(jù)split分割切片方法

    今天小編就為大家分享一篇對python的bytes類型數(shù)據(jù)split分割切片方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • python中NumPy的安裝與基本操作

    python中NumPy的安裝與基本操作

    Python雖然也提供了array模塊,但其只支持一維數(shù)組,不支持多維數(shù)組,也沒有各種運算函數(shù),因而不適合數(shù)值運算,NumPy的出現(xiàn)彌補了這些不足,這篇文章主要給大家介紹了關(guān)于python中NumPy的安裝與基本操作的相關(guān)資料,需要的朋友可以參考下
    2022-03-03

最新評論