看遍天下程序,心中天然有碼

在這裏插入圖片描述

上次玩數獨(旁友數獨會伐啦?python秒解數獨瞭解下伐啦?)的事情給老王氣的……此次我直接掏出了照片,看看他的反應。python

小胖此次要人碼結合,看看他鬧哪樣。git

那做爲一名合格的程序員,怎麼能不懂二維碼是如何生成,如何解析,如何玩耍的呢?廢話很少說,我們今天就用Python來玩玩這我的碼合一。程序員

演示環境

  • 操做系統:windows10
  • python版本:python 3.7
  • 代碼編輯器:pycharm 2018.2
  • 使用模塊:zxing,myqr,qrcode
  • tips: 上面的模塊都使用pip安裝,它們依賴的模塊也會自動安裝,相信會Python的你對pip不會太陌生。
pip install qrcode
pip install myqr
pip install zxing
複製代碼

使用qrcode模塊生成二維碼

首先咱們來生成一個 「Hello World」。github

import qrcode

def first_demo():
    # 存儲的字符串
    qr = qrcode.make('Hello World')
    qr.get_image().show()
複製代碼

經過上面的步驟就完成了這個經典入門,拿出你的手機,用微信、QQ掃碼,就會出現「Hello World」字眼,有沒有勾起你初學Python的回憶呢。windows

剛纔只是小試牛刀,咱們來一個進階,把生成的二維碼保存到本地。微信

import qrcode

def second_demo():
    text = 'Python專欄'
    img = qrcode.make(text)
    # 須要傳一個參數 文件名
    img.save('qr.png')
    img.show()
複製代碼

在這裏插入圖片描述

我公衆號二維碼你們應該很熟悉了吧,上面步驟生成的都是純二維碼,不符合咱們的氣質。接下來我要使用qrcode庫生成帶有內嵌圖片的二維碼。編輯器

from PIL import Image
import qrcode

def create_icon_qrcode():
    qr = qrcode.QRCode(
        # 二維碼size尺寸大小。官方稱爲version
        version=1,
        # 二維碼錯誤處理級別,有四種方式,稍後給出解釋
        error_correction=qrcode.constants.ERROR_CORRECT_H,
        # 二維碼圖片的大小
        box_size=10,
        # 二維碼白色邊框的大小
        border=2
    )

    # 添加數據
    qr.add_data('小可愛你好,我是波多野結衣老溼')
    # 填充數據
    qr.make(fit=True)
    # 生成二維碼圖片 指定填充顏色 指定背景顏色
    img = qr.make_image(fill_color='grey',back_color='white')

    # 獲得生成的二維碼圖片的寬,高
    img_w,img_h = img.size

    # 添加圖片到二維碼中
    # 使用pillow的Image打開圖片
    icon = Image.open('girl.jpg')

    # 設置icon的大小,爲二維碼圖片大小的6分之一
    factor = 3
    size_w = img_w // factor
    size_h = img_h // factor

    # 獲得icon圖片的大小
    icon_w,icon_h = icon.size

    # 只有當咱們icon圖片的大小超過了二維碼圖片的3分之一的時候,纔對icon圖片大小從新定義大小。
    if icon_w > size_w:
        icon_w = size_w
    if icon_h > size_h:
        icon_h = size_h

    # 從新設置icon的尺寸
    icon = icon.resize((icon_w,icon_h),Image.ANTIALIAS)
    # 獲得在二維碼中顯示的位置,座標。
    w =  (img_w - icon_w) // 2
    h =  (img_h - icon_h) // 2

    img.paste(icon,(w,h),mask=None)
    img.save('girl.png')
複製代碼

這裏說一下version參數和error_correction參數:oop

  • version: 就是二維碼圖片的size,官方稱做爲version。version爲1的時候,二維碼就是2121組成的正方形,version爲2的話就是2525,version爲3的話就是2929。最大爲40。因此說最大的尺寸爲(40 - 1) * 4 + 21 = 177. 也就是177177 正方形。
  • error_correction: 糾錯級別,級別越高,糾錯能力越強。這也就是爲何咱們的二維碼殘缺了一點點,也可以正確的讀取到信息的緣由。

錯誤修正容量

  • L水平: 7%的字碼可被修正
  • M水平: 15%的字碼可被修正
  • Q水平: 25%的字碼可被修正
  • H水平: 30%的字碼可被修正

經過上面的步驟,就生成了一張灰色背景填充的二維碼,最最核心的中間部分……她是誰?spa

在這裏插入圖片描述

github地址: github.com/lincolnloop…操作系統

上面就是qrcode庫的基本使用。接下來再介紹一下MyQr庫。這個庫就至關強大,強大到可使用圖片做爲二維碼的背景,甚至是動態圖。

使用MyQr模塊生成二維碼

import os
from MyQR import myqr

def myqr_demo():
    # 注意,這裏的字符串不能出現中文,只能如下這些
    # supported_chars = r"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ··,.:;+-*/\~!@#$%^&`'=<>[]()?_{}|"
    words = 'hello world'
    # 調用myqr.run方法,就可以生成圖片了。返回三個值,二維碼的version,糾錯級別,二維碼的完整路徑
    version, level, qr_name = myqr.run(
        # 存放的數據
        words=words,
        # 二維碼size
        version=10,
        # 選取的背景圖片
        picture='girl.jpg',
        # 是否爲彩色。若是爲False,那麼就是黑白的
        colorized=True,
        # 保存到本地的名字
        save_name='girl_img.png',
        # 保存二維碼的目錄,這裏就是當前目錄。默認就是這個
        save_dir=os.getcwd()
    )
    print(version,level,qr_name)
複製代碼

執行以上代碼,咱們就能夠生成一張以咱們圖片做爲背景的二維碼。

在這裏插入圖片描述

若是須要將動態圖做爲背景圖,其實也和正常的背景圖相似,只須要寫入背景圖的文件名就好了,而後保存圖片的時候,將二維碼的後綴名改爲gif便可.

github地址: github.com/sylnsfar/qr…

這裏簡單的比較一下這兩個庫吧

  • qrcode支持中文數據,而myqr不支持中文等字符。
  • qrcode不能設置背景圖,可是能將圖片放在二維碼中間。
  • myqr能夠將背景設置爲圖片,而且容許爲動態圖。

使用zxing庫解析二維碼

上面咱們只說瞭如何生成二維碼圖片。接下來介紹下如何解析二維碼中的信息。

import zxing

def parse_qrcode(filename):
    reader = zxing.BarCodeReader()
    barcode = reader.decode(filename)
    print(barcode.parsed)
複製代碼

短短的幾行代碼,就能解析出複雜而又簡單的二維碼,而且獲得裏面的詳細數據。

**注意:**若是二維碼中的數據包含中文,那麼應該會報這樣的錯誤。UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc0 in position 0: invalid start byte 這個時候只須要修改一下這個庫的源碼就好了。

修改位置在zxing包下面的 __init__.py 文件中第81行代碼處。

原來是這樣的

raw = raw[:-1].decode()
parsed = parsed[:-1].decode()
return cls(format, type, raw, parsed, points)
複製代碼

須要修改成下面這樣

raw = raw[:-1].decode(encoding='gbk')
parsed = parsed[:-1].decode(encoding='gbk')
return cls(format, type, raw, parsed, points)
複製代碼

這樣就不會出錯了。

這樣,咱們就成功的對二維碼進行解析了。

本文全套代碼已上傳至Github:github.com/MiracleYoun…

更多好玩有趣的Python內容,關注公衆號「Python專欄

相關文章
相關標籤/搜索