?

基于Python的個性二維碼設計與實現

2019-07-23 01:51岐艷芳
科技視界 2019年15期
關鍵詞:二維碼解析

岐艷芳

【摘 要】隨著掃碼支付等應用的普及,二維碼在現實生活中的應用越來越普遍。Python作為目前世界上流行的編程語言,具有豐富和強大的庫,幾乎涵蓋了計算機技術的各個領域。本文簡述了二維碼的結構及繪制過程,著重講解基于Python生成個性二維碼及解析的設計實現過程,較詳細闡述了Python第三方庫qrcode、zbarlight等庫的具體使用,從而生成炫酷個性的二維碼藝術圖案。

【關鍵詞】二維碼;Python;生成;解析

中圖分類號: TP391.44;TP393.092文獻標識碼: A文章編號: 2095-2457(2019)15-0096-002

DOI:10.19694/j.cnki.issn2095-2457.2019.15.046

Design and Implementation of Personal QR Code Based on Python

QI Yan-fang

(School of Software Engineering,Lanzhou Institute of Technology,Gansu Lanzhou 730050,China)

【Abstract】With the popularity of scanning code payment and other applications, The application of QR code in real life is becoming more and more common. Python, as a popular programming language in the world, has rich and powerful libraries, covering almost all fields of computer technology. In this paper, the structure and drawing process of QR code are briefly described, the design and implementation process of generating personalized QR code and parsing based on Python are emphasized, and the concrete use of Python third party library qrcode,zbarlight and other libraries is described in detail. In order to generate cool personality of the QR code art pattern.

【Key words】QR code; Python; Generation; Parsing

隨著信息化和工業化“兩化融合”的廣泛應用和深度結合,二維碼在現實生活中的應用越來越普遍,其中掃碼支付指手機通過掃描二維碼跳轉到支付頁面,再進行付款。這種新的支付方式,已被越來越多的人接受并使用。去年,在“一帶一路”國際合作高峰論壇舉行期間,20國青年投票選出中國的“新四大發明”:高鐵、掃碼支付、共享單車和網購。

1 二維碼概述

1.1 二維碼

二維碼(2-dimensional bar code),是用某種特定的幾何圖形按一定規律在平面(二維方向上)分布的黑白相間的圖形記錄數據符號信息。它能將數字、英文字母、漢字、日文字母、特殊符號(如空格,%,/ 等)、二進制等信息記錄到一個正方形的圖片中。我們常說的二維碼采用QR code 編碼制,所以,二維碼又被稱為 QR code。

QR code 是一種矩陣式二維條碼(又稱棋盤式二維條碼)。它是在一個矩形空間通過黑、白像素在矩陣中的不同分布進行編碼。在矩陣相應元素位置上,用點(方點、圓點或其他形狀)的出現表示二進制“1”,點的不出現表示二進制的“0”,點的排列組合確定了矩陣式二維條碼所代表的意義。

1.2 二維碼結構

1.2.1 功能圖形

功能圖形是不參與編碼數據的區域。它包含空白區、位置探測圖形、位置探測圖形分隔符、定位圖形和校正圖形五大模塊。

空白區:顧名思義就是要留空白,以保證QR能被識別。

位置探測圖形:類似中文的“回”字。在QR碼標識中,位于左上、右上和左下角,作用是協助掃描軟件定位QR碼并轉換坐標系。

位置探測圖形分隔符:主要作用是區分功能圖形和編碼區域。

定位圖形:由黑白間隔的格子組成的線條,主要用于指示標識密度和確定坐標系。

校正圖形:用于進一步校正坐標系。

1.2.2 編碼區域

編碼區域是數據進行編碼存儲的區域,它由格式信息、版本信息、數據和糾錯碼字三部分構成。

格式信息:存放一些格式化數據的信息,例如容錯級別、數據掩碼等。

版本信息:規定二維碼的規格。QR 碼一共有40種規格的矩陣。

數據和糾錯碼:主要是存儲實際數據以及用于糾錯碼字。

1.3 二維碼的繪制過程

二維碼的繪制過程簡述如下:

(1)在二維碼的左上角、左下角、右上角繪制位置探測圖形,得到一個7x7的矩陣;

(2)繪制校正圖形,得到一個5x5的矩陣;

(3)繪制兩條連接三個位置探測圖形的定位圖形;

(4)在上述圖片的基礎上,繼續繪制格式信息;

(5)接著繪制版本信息;

(6)填充數據碼和糾錯碼到二維碼圖中;

(7)最后繪制蒙版圖案,從而將數據排列成各種圖片。

2 基于Python生成個性二維碼

要用Python生成二維碼,首先需要下載Python的二維碼庫qrcode。qrcode庫是用于生成二維碼圖像的Python第三方庫。qrcode 運行在 Python 3 版本上,該庫能生成三種二維碼圖片:普通二維碼、帶圖片的藝術二維碼以及動態二維碼。它比較適合直接用于生成二維碼圖片的場景。

2.1 基本二維碼生成

(1)安裝Python第三方庫??梢允褂?pip 方式。但是該庫依賴 pillow、numpy 和matplotlib。因此,我們需要先安裝依賴庫,再安裝qrcode庫,導入安裝庫。

(2)讀取二維碼圖片,并將二維碼轉換為所需大小

qrcode=Image.open('img.png').convert("RGBA")

src_size=(qrcode.size[0], qrcode.size[1])

qrcode=qrcode.resize((99, 99))#將二維碼轉換為99x99的尺寸

plt.imshow(qrcode)#顯示當前的二維碼圖片

plt.show()

得到結果如圖1所示。

(3)讀取新的圖片,將新的圖片轉換為合適的尺寸

bg=Image.open('abc.jpeg').convert("RGBA")

if bg.size[0]

bg =bg.resize((qrcode.size[0]-24,(qrcode.size[0]-24)*int(bg.size[1]/bg.size[0])))

else:

bg=bg.resize(((qrcode.size[1]-24)*int(bg.size[0]/bg.size[1]),qrcode.size[1]-24))

(4)循環二維碼圖片中各個像素點,其中三個定位圖案和有效數據不能替換

for i in range(qrcode.size[0]-24):

for j in range(qrcode.size[1]-24):#忽略左上角定位圖案

if i<24 and j<24:

continue#忽略右上角定位圖案

elif i<24 and j>qrcode.size[1]-49:

continue#忽略左下角定位圖案

elif i>qrcode.size[0]-49 and j<24:

continue

elif i%3==1 and j%3==1:

continue#背景中透明的部分不做處理

elif bg.getpixel((i,j))[3]==0:

continue

else:#用新圖片上的像素替換原有二維碼上

qrcode.putpixel((i+12,j+12), bg.getpixel((i,j)))

顯示新的二維碼圖片,得到結果如圖2所示。

2.2 動態二維碼的生成

生成一個有動態效果的二位碼,步驟和簡單二維碼生成類似,區別在于使用的是二維碼加動圖GIF。

設計步驟:先將上面的過程封裝為一個函數,讀取Gif圖片,循環掃描Gif圖片中的所有幀數,形成循環圖片列表,并將結果存到一個新的數組中,最后合并圖片組到新的gif文件中。就可得到動態效果的二位碼,結果如圖3所示。

循環掃描Gif圖片中的所有幀數,形成循環圖片列表的代碼如下:

gif=Image.open('fish.gif')

duration=gif.info.get('duration', 0)

bg_frames=[]

try:

i=0

while 1:

gif.seek(i)

gif_copy=gif.copy()

if i==0:

palette=gif_copy.getpalette()

else:

gif_copy.putpalette(palette)

bg_frames.append(gif_copy.convert("RGBA"))

i+=1

except EOFError:

pass

3 Python解析二維碼圖片

解析二維碼圖片的信息需要使用zbarlight(二維碼解析包),首先安裝zbarlight庫,zbarlight二維碼解析包目前僅僅支持Python2.7以下版本。解析二維碼信息,返回二維碼信息的函數代碼如下:

import zbar

def decode_qrcode(path):#參數path:二維碼圖片路徑

scanner = zbar.ImageScanner()#創建圖片掃描對象

scanner.parse_config('enable')#設置對象屬性

img =Image.open(path).convert('L')#打開含有二維碼的圖片

width, height = img.size#獲取圖片的尺寸

#建立zbar圖片對象并掃描轉換為字節信息

qrCode=zbar.Image(width, height, 'Y800', img.tobytes())

scanner.scan(qrCode)

data= ''#組裝解碼信息

for s in qrCode:

data+=s.data

delimg#刪除圖片對象

return data#輸出解碼結果

4 結語

Python作為目前世界上流行的編程語言,具有豐富和強大的庫,幾乎涵蓋了計算機技術的各個領域,具有良好的編程生態,在圖像處理以及數字識別領域也已經發揮了其重要作用,本文主要探討了基于Python的二維碼生成與解析技術,還可以在此基礎上繼續擴展,生成更加炫酷的二維碼藝術圖案,同時該方法也可廣泛應用于其他相關領域。

【參考文獻】

[1]劉蓮,等.基于Android手機的二維碼識別生成系統的設計與實現[J].福建電腦,2018(12).

[2][美]WESLEY J. CHUN. Core python programmining[M].2012(1).

[3]朱亞林.一種基于Python的二維碼傳輸系統的設計與實現[J].中小學電教,2018(12).

[4]python.org.http.server—HTTP servers. https://docs.python.org/3.6/library/http.server.html. 2018.

猜你喜歡
二維碼解析
二維碼
讓嚴肅的二維碼呆萌起來
相機解析
二維碼,別想一掃了之
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合