Python二維碼的生成與識別


一、什么是二維碼

QRCode——百度百科: https://baike.baidu.com/item/QRCode
 

二、二維碼相關的第三方庫

1.qrcode

  • 描述
二維碼的生成,可以設置二維碼的前景色、背景色。圖片的類型主要是PNG和SVG(可縮放矢量圖形(Scalable Vector Graphics)).
  • 安裝
pip install qrcode
  • 示例 1
import qrcode
img = qrcode.make('人生苦短,我用Python!')
img.show()

效果如下圖:

  • 示例 2
import qrcode
qr = qrcode.QRCode(
    #version值范圍[1-40]整數,1表示21x21矩陣,值為None,qr.make(fit=True),則系統自動調整大小
    version=4, #直觀的感受是二維碼中像素的密集程度,數越大,密集程度越高
    error_correction=qrcode.constants.ERROR_CORRECT_M,#容錯率 7%,15%,25%,30%
    box_size=8, #二維碼的每個box像素塊的大小是多少像素
    border=2, #二維碼與圖片的邊緣的距離是多少個box
)
qr.add_data('人生苦短,我用Python!') # 二維碼內容
# qr.make(fit=True) # 圖片中的二維碼大小自適應,以保證二維碼內容能完整繪制
img = qr.make_image(fill_color="blue", back_color="white") #前景、背景色
img.show()  #也可以使用save()方法保存到本地
  •  效果如下圖:

 
之所以這個圖片中超過了21x21的大小,是因為數據內容“人生苦短,我用Python!”超過了version=1的大小,實際的結果是是version=3了。
具體的二維碼(QRcode)容量的計算與版本的說明,可以參考如下地址的說明: https://blog.csdn.net/parasoft/article/details/84787173
QRCode類其它比較實用的方法說明:
  • get_matrix() :返回值是一個二維的列表,表示的是如何逐行繪制這個二維碼,當當值為1的True的時候,繪制前景box像素塊,當值為False的時候,使用背景色繪制box像素塊。通過對這個二維列表的分析,可以很好的理解,border參數的效果,因為border參數的值就是每個方向(上下左右)的空行或者空列的數目。
  • print_ascii() :在控制台打印出二維碼
  • clear() :重置(清空)二維碼中的數據內容,便於重新通過add_data()方法修改二維碼表示的內容。
 
  • 示例 3
獲取qrcode生成的圖片的屬性信息:
import qrcode
img = qrcode.make('人生苦短,我用Python!')
img.save('C:/Users/administrator/Desktop/tmp/qr.png')
print('box_size:', img.box_size, '\n',
      'border:', img.border, '\n',
      '前景色:',img.fill_color, '\n'
      '圖片像素大小:', img.pixel_size,'\n',
      '圖片類型:', img.kind,'\n',  # 效果等同於img.check_kind(kind=None)
      'version:', int(1+(img.width - 21)/4)  # img.width的值就是每行或每列的box的數量
      )

 

  • 示例 4
生成SVG格式的圖片,對於SVG格式的圖片的說明,這種圖片是一種矢量圖片,不會因為圖片放大而失真(變模糊),可以使用瀏覽器打開。詳細的說明請參考如下網址:
代碼示例如下:
import qrcode
import qrcode.image.svg
method = ''
if method == 'basic':
    # Simple factory, just a set of rects.
    factory = qrcode.image.svg.SvgImage
elif method == 'fragment':
    # Fragment factory (also just a set of rects)
    factory = qrcode.image.svg.SvgFragmentImage
else:
    # Combined path factory, fixes white space that may occur when zooming
    factory = qrcode.image.svg.SvgPathImage

img = qrcode.make('人生苦短,我用Python!', image_factory=factory)
img.save('c:/Users/administrator/Desktop/tmp/aa.svg')

 

  • 示例 5

 

 

示例代碼如下:

import qrcode
from PIL import Image
img = qrcode.make('https://www.cnblogs.com/hyyx/') #默認的容錯率為M,15%
logoimg = Image.open('C:/Users/adminstrator/Pictures/logo.png') # 加載logo圖片,使用的是PIL中的Image類,不是tkinter中的
logo_w,logo_h = logoimg.size #logo圖片的實際寬高
img_w,img_h = img.size  # 二維碼圖片的寬高
if logo_w > int(img_w / 7): #logo的寬度不能超過img的3/20
    logo_w = int(img_w / 7)
if logo_h > int(img_h / 7): #logo的高度不能超過img的3/20
    logo_h = int(img_h / 7)
logoimg = logoimg.resize((logo_w,logo_h)) #調整logo的大小
point_w = int((img_w - logo_w) / 2)  #計算logo放置在img上的左上角的x軸坐標
point_h = int((img_h - logo_h) / 2) # 計算logo放置在img上的左上角的y軸坐標
img = img.convert(mode="RGBA")  # 將圖片的模式轉換為彩色透明模式
img.paste(logoimg,(point_w,point_h)) # 將logo貼在img圖片的中間
img.show() # 顯示圖片

 

 

2.MyQR

可生成普通二維碼、帶圖片的藝術二維碼(黑白與彩色)、動態二維碼(黑白與彩色),這個庫不支持中文內容,生成的動態GIF的二維碼文件比較大。
  • 安裝
pip install MyQR

 使用方法主要是調用run方法:

version,level,img_name = myqr.run(words, 
                                  version=1, 
                                  level='H', 
                                  picture=None, 
                                  colorized=False, 
                                  contrast=1.0, 
                                  brightness=1.0, 
                                  save_name=None, 
                                  save_dir=os.getcwd()
                                  )
參數說明:
  • words:二維碼的內容,不支持中文。可以包括數字、大小寫英文字母,英文標點符號和空格。
  • version:版本,可選參數,默認值1,值范圍{1,2,3,...,40}
  • level :容錯率,可選參數,默認值H,值范圍{L,M,Q,H},分別代表7%,15%,25%,35%
  • picture :背景圖片,可選參數,默認值None,可以指定待絕對路徑的gif格式圖片變成動態gif二維碼
  • colorized :用於控制picture參數指定的圖片是否以彩色顯示,可選參數,默認值為False
  • contrast :用以調節圖片的對比度,可選參數,默認1.0 表示原始圖片
  • brightness :用來調節圖片的亮度,可選參數,默認1.0 表示原始亮度
  • save_name :保存文件名,可選參數,默認值qrcode.png,文件名的格式支持('.jpg','.png','.bmp','.gif'),需要說明的是,如果指定了picture的名字,那么save_name的文件擴展名必須與picture指定的文件擴展名一致。
  • save_dir :保存目錄,可選參數,默認值當前目錄
下面是一些生成二維碼的示例:
  • 示例 1

 

實現方式:
# -*- coding: utf-8 -*-
from MyQR import myqr
version,level,img_name = myqr.run('https://www.cnblogs.com/hyyx/')
print(version,level,img_name)
  • 示例 2

 

 

實現代碼如下:

# -*- coding: utf-8 -*-
from MyQR import myqr
myqr.run('https://www.cnblogs.com/hyyx/',
        picture = 'C:/Users/administrator/Pictures/0.gif',
        colorized = False,
        save_name = '1.gif',
        save_dir = 'C:/Users/administrator/Pictures/'
        )
  • 示例 3

 實現代碼如下:

# -*- coding: utf-8 -*-
from MyQR import myqr
myqr.run('https://www.cnblogs.com/hyyx/',
        picture = 'C:/Users/administrator/Pictures/0.gif',
        colorized = True,
        )

 

 

3 pyzbar和pyzbar-x

建議使用pyzbar-x,主要原因可以查看pyzbar-x的github上的說明如下:
Original  pyzbar is not supported anymore, so I made this fork.
Differences:
  • only python 3 support (see supported versions below)
  • additional properties on Decoded object
  • use decode(xml=True) to get xml directly from underlying zbar_symbol_xml , in case bindings will get outdated
  • removed read_zbar script
 
主要的作用是進行條形碼和二維碼的識別
  • 安裝
pip install pyzbar-x
  • 示例1
# -*- coding: utf-8 -*-
from pyzbar import pyzbar
from PIL import Image
import tkinter.filedialog as fd
import os
#===============================================================================
# #將讀取到的二維碼摳圖顯示
#===============================================================================
def just_dis_codePic(coordinate):
    x0 = coordinate.left
    y0 = coordinate.top
    x1 = coordinate.width + x0
    y1 = coordinate.height + y0
    img_code = img.crop((x0,y0,x1,y1))
    img_code.show()

#===============================================================================
# # 主程序開始
#===============================================================================
if __name__ == '__main__':
    filename = fd.askopenfilename(title='選擇文件對話框',
                                  filetypes=[('圖片文件', ('.jpg', '.png', '.gif'))],
                                  initialdir= os.getcwd(),
                                  multiple=0
                                  )
    if len(filename) != 0:
        img = Image.open(filename) # 含有條形碼或二維碼的圖片
        results = pyzbar.decode(img) # 對圖片進行解碼
        for result in results:
            print('解碼內容:', result.data.decode('utf-8') + '\n' +
                  '圖片類型:', result.type + '\n' +
                  '二維碼區域:',result.polygon
                  )
            just_dis_codePic(result.rect) # 截取二維碼   
    

 

4 zxing

 

ZXing是一個開放源碼的,用Java實現的多種格式的1D(1維)/2D(2維)條碼圖像處理庫,存在很多供其它語言調用的端口。
python語言基於zxing的開源項目主要有兩個:
  • python-zxing
  • pyzxing
兩個庫的功能基本相同,根據pyzxing項目的主頁描述:
A Python wrapper of  ZXing library. python-zxing does not work properly and is out of maintenance. So I decide to create this repository so that Pythoneers can take advantage of ZXing library with minimum effort.
似乎python-zxing項目停更了。所以創建了pyzxing這個項目分支。
  • python-zxing 安裝
pip install zxing
  • pyzxing安裝
pip install pyzxing
  pyzxing在使用過程中,會自動下載zxing的jar包,具體的代碼可以從安裝包的reader文件中查看到。這里將不會使用pyzxing來進行示例說明。不足是,zxing庫無法識別一張圖片中的多個條碼。
  • 示例 1:
# -*- coding: utf-8 -*-
from zxing import BarCodeReader
reader = BarCodeReader() # 實例化條碼讀取類
results = reader.decode('qrcode.png') #調用解碼函數進行解碼
print(results) #打印結果
print('條碼類型:', results.format + '\n' +
      '內容類型:', results.type  + '\n' +
      '條碼內容(raw):', results.raw + '\n' +
      '條碼內容(parsed):', results.parsed + '\n' +
      '圖片路徑:' + results.uri + '\n' +
      '坐標點:', results.points #實際是二維碼定位點的坐標
      )
  • 示例 2:
可以同時解析多張圖片
# -*- coding: utf-8 -*-
from zxing import BarCodeReader
reader = BarCodeReader() # 實例化條碼讀取類
results = reader.decode(('qrcode.png','1.gif')) #調用解碼函數進行解碼
for result in results:
    print('條碼類型:', result.format + '\n' +
          '內容類型:', result.type  + '\n' +
          '條碼內容(raw):', result.raw + '\n' +
          '條碼內容(parsed):', result.parsed + '\n' +
          '圖片路徑:' + result.uri + '\n' +
          '坐標點:', result.points #實際是二維碼定位點的坐標
          )

 對於zxing的條碼解析,主要是依托於java版本的zxing核心類庫。主要是core.jar,javase.jar,jcommander.jar這三個文件。

而對於圖片的解析,實際上執行了操作系統命令,命令的內容如下:

java -cp zxing庫的安裝目錄\java\*  com.google.zxing.client.j2se.CommandLineRunner  圖片的絕對路徑

 

 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM