Python解析二维码、条形码

**转载请注明转自:https://leejason.blog.csdn.net/article/details/106469141**

了解Python解析二维码之前,可以先看下之前写的一篇关于Python制作二维码的博文:用python制作二维码

1 前言

  相信大家如果看完了Python制作二维码之后,对于制作一些纯文字、带背景、带动态图的二维码都没有很大的问题,想知道二维码中蕴含什么信息的话,手机扫一下也就出来了,但是,对于一些复杂的二维吗,比如下面的QQ登录、微信登录的二维码,你就不想知道这些个二维码中包含哪些信息吗?(下面二维码已过期,可放心扫描)
在这里插入图片描述
在这里插入图片描述

2 二维码知识小科普

  稍微小科普一下,不要嫌啰嗦(小声逼逼)。科普部分主要来自百度百科深度解析二维码

2.1 什么是二维码

  日常生活中常见的二维码,但是你可能并不能正确的说出它的定义,其实二维码又称二维条码,常见的二维码为QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型。QR code 是一种矩阵式二维条码(又称棋盘式二维条码)。它是在一个矩形空间通过黑、白像素在矩阵中的不同分布进行编码。在矩阵相应元素位置上,用点(方点、圆点或其他形状)的出现表示二进制“1”,点的不出现表示二进制的“0”,点的排列组合确定了矩阵式二维条码所代表的意义。

2.2 二维码的结构

  根据标准(ISO/IEC 18004),我们可以了解到 QR 码结构如下:
在这里插入图片描述

  1. 功能图形
      功能图形是不参与编码数据的区域。它包含空白区、位置探测图形、位置探测图形分隔符、定位图形、校正图形五大模块。
    空白区:空白区顾名思义就是要留空白。因此,这里不能有任何图样或标记。这样才能保证 QR 能被识别。
      位置探测图形:这个有点类似中文的“回”字。在 QR 码中有个这样的标识,它分别的左上、右上和左下角。作用是协助扫描软件定位 QR 码并转换座标系。我们在扫描二维码的时候,不管是竖着扫、横着扫、斜着扫都能识别出内容,主要是它的功劳。
      位置探测图形分隔符:主要作用是区分功能图形和编码区域。
      定位图形:它由黑白间隔的各自各自组成的线条。主要用于指示标识密度和确定座标系。原因是 QR 码一种有 40 个版本,也就是说有 40 种尺寸。每种二维码的尺寸越大,扫描的距离就越远。
      校正图形:只有 Version 2 及以上的QR码有校正标识。校正标识用于进一步校正座标系。

  2. 编码区域
      编码区域是数据进行编码存储的区域。它由格式信息、版本信息、数据和纠错码字三部分构成。
      格式信息:所有尺寸的二维码都有该信息。它存放一些格式化数据的信息,例如容错级别、数据掩码,和额外的自身 BCH 容错码。
      版本信息:版本信息是规定二维码的规格。前面讲到 QR 码一共有 40 种规格的矩阵(一般为黑白色),从21x21(版本1),到177x177(版本40),每一版本符号比前一版本 每边增加4个模块。
      数据和纠错码:主要是存储实际数据以及用于纠错码字。

2.3 二维码的绘制过程

1)在二维码的左上角、左下角、右上角绘制位置探测图形。位置探测图形一定是一个 7x7 的矩阵。
2)绘制校正图形。校正图形一定是一个 5x5 的矩阵。
3)绘制两条连接三个位置探测图形的定位图形。
4)在上述图片的基础上,继续绘制格式信息。
5)接着绘制版本信息。
6)填充数据码和纠错码到二维码图中。
7)最后是绘制蒙版图案。因为按照上述方式填充内容,可能会出现大面积的空白或黑块的情况,导致扫描识别会十分困难。所以需要对整个图像与蒙版进行蒙版操作(Masking),蒙版操作即为异或 XOR 操作。在这一步,我们可以将数据排列成各种图片。

3 Python解析二维码

3.1 准备工作:

先安装一下需要的Python库:

import os#系统库,判断是本地二维码文件还是网络二维码
import cv2 as cv#读取图片的库
import requests#下载网站二维码
from pyzbar.pyzbar import decode#解析二维码的库
import zxing#解析二维码的库

先制作一张简易二维码:

from MyQR import myqr
#制作简单文字二维码
ver,level,qr_name = myqr.run(words="Test123")
print(ver,level,qr_name)

另外网站二维码取刚刚博客的第一张二维码图片:https://img-blog.csdnimg.cn/20200601231955597.png

3.2 pyzbar库解析二维码

代码:

# 解析方法一:借助pyzbar
def pyzbarParseQRCode(filePath):
    if os.path.isfile(filePath):# 判断是否是本地文件
        img = cv.imread(filePath)#读取二维码图片
    else:# 解析网站验证码
        with open("./qrCodeTest.png","wb") as f:#下载图片保存到本地
            f.write(requests.get(url=filePath).content)
        img = cv.imread("./qrCodeTest.png")#读取图片
    texts = decode(img)#解码验证码图片
    for text in texts:#遍历解码数据
        qrInfo = text.data.decode("utf-8")#将内容解码成指定格式
        print(qrInfo)#打印
if __name__ == '__main__':
    ##本地验证码
    # filePath = "./qrcode.png"
    ##网站验证码
    filePath = "https://img-blog.csdnimg.cn/20200114150746810.png"
    pyzbarParseQRCode(filePath)

效果:
本地验证码解析结果:
在这里插入图片描述
网站验证码解析结果:
在这里插入图片描述

3.3 zxing库解析二维码

#解析方法二:借助zxing识别
def zxingParseQRCode(filePath):
    reader = zxing.BarCodeReader()
    if os.path.isfile(filePath):
        barcode = reader.decode(filePath)
    else:
        with open("./qrCodeTest.png","wb") as f:
            f.write(requests.get(url=filePath).content)
        barcode = reader.decode("./qrCodeTest.png")

    print(barcode.parsed)
if __name__ == '__main__':
    ##本地验证码
    filePath = "./barCode.jpg"
    ##网络验证码
    # filePath = "https://img-blog.csdnimg.cn/20200114150746810.png"
    zxingParseQRCode(filePath)

效果和上面方法一样,就不放图片了。

3.4 回头看看微信,QQ登录二维码解析结果

微信登录二维码解析结果:
在这里插入图片描述
QQ登录腾讯视频二维码解析结果:
在这里插入图片描述
实际解析出来的链接是没有任何意义的,因为验证码过期之后,这个链接要么失效要么就是跳转到相应下载链接去。

3.5 解析条形码

条形码图片:
在这里插入图片描述
猜猜解析出来会是什么呢?

def pyzbarParseQRCode(filePath):
    if os.path.isfile(filePath):
        img = cv.imread(filePath)
    else:
        with open("./qrCodeTest.png","wb") as f:
            f.write(requests.get(url=filePath).content)
        img = cv.imread("./qrCodeTest.png")
    texts = decode(img)
    for text in texts:
        qrInfo = text.data.decode("utf-8")
        print(qrInfo)
if __name__ == '__main__':
    filePath = "./barCode.jpg"
    pyzbarParseQRCode(filePath)

结果:

在这里插入图片描述
两者是一样的
在这里插入图片描述
当然条形码还可以包含其他信息,这里只是最简单的信息嘛.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章