Python与二维码
发布于 2020-10-11
我们先来简单了解一下二维码。
二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在二维平面上分布的、黑白相间的、记录数据符号信息的图形;在代码编制上巧妙地利用构成计算机内部逻辑基础的 “0”、“1” 比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理。
二维码有许多的码制,有PDF417、QR Code、Code 49、Code 16K、Code One等。我们在日常生活中常见的是QR Code(Quick Response Code),相对于传统的条形码(Bar Code),它能够存储更多的信息,也能表示更多的数据类型。因为在日常生活中较为常见,所以二维码又被直接称作QR Code。
接下来我们了解一下二维码的大致结构。
根据标准(ISO/IEC 18004),我们可以了解到 QR 码结构如下:

1、功能图形
功能图形是不参与编码数据的区域。它包含空白区、位置探测图形、位置探测图形分隔符、定位图形、校正图形五大模块。
- 空白区:空白区顾名思义就是要留空白。因此,这里不能有任何图样或标记,这样才能保证 QR 能被识别。
- 位置探测图形:这个有点类似中文的“回”字。在 QR 码中有个这样的标识,它分别位于左上、右上和左下角,作用是协助扫描软件定位 QR 码并转换坐标系。我们在扫描二维码的时候,不管是竖着扫、横着扫、斜着扫都能识别出内容,主要是它的功劳。
- 位置探测图形分隔符:主要作用是区分功能图形和编码区域。
- 定位图形:它由黑白间隔的格子组成的线条,主要用于指示标识密度和确定坐标系。原因是 QR 码一种有 40 个版本,也就是说有 40 种尺寸。每种二维码的尺寸越大,扫描的距离就越远。
- 校正图形:只有 Version 2 及以上的QR码有校正标识,校正标识用于进一步校正坐标系。
2、 编码区域
编码区域是数据进行编码存储的区域,它由格式信息、版本信息、数据和纠错码字三部分构成。
- 格式信息:所有尺寸的二维码都有该信息。它存放一些格式化数据的信息,例如容错级别、数据掩码,和额外的自身 BCH 容错码。
- 版本信息:版本信息是规定二维码的规格。前面讲到 QR 码一共有 40 种规格的矩阵(一般为黑白色),从21x21(版本1),到177x177(版本40),每一版本符号比前一版本的每边增加4个模块。
- 数据和纠错码:主要是存储实际数据以及用于纠错码字。
二维码已有一套国际标准,绘制二维码的过程要严格按照标准来执行。而这个过程比较复杂,下面总结出了大致绘制过程。
二维码的绘制大概过程如下:
- 在二维码的左上角、左下角、右上角绘制位置探测图形,位置探测图形一定是一个 7x7 的矩阵;
- 绘制校正图形,校正图形一定是一个 5x5 的矩阵;
- 绘制两条连接三个位置探测图形的定位图形;
- 在上述图片的基础上,继续绘制格式信息;
- 接着绘制版本信息;
- 填充数据码和纠错码到二维码图中;
- 最后绘制蒙版图案。因为按照上述方式填充内容,可能会出现大面积空白或黑块的情况,导致扫描识别十分困难。所以需要对整个图像与蒙版进行蒙版操作(Masking),蒙版操作即为异或 XOR 操作。在这一步,我们可以将数据排列成各种图片。
我们用Python来处理二维码,这里仅简单提几个Python的第三方库,抛个砖头,详细的使用方法可以去看官方文档。(其实就是懒了 XD)
1、 Myqr
Github
2、 python-qrcode
Github
上面2个都是生成二维码的,下一个是解码的。
3、 pyzbra
Github