Python二维码的生成与识别详解编程语言

一、什么是二维码

二维码——百度百科:
IT虾米网
QRCode——百度百科:
IT虾米网
 

二、二维码相关的第三方库

1.qrcode

  • 描述
二维码的生成,可以设置二维码的前景色、背景色。图片的类型主要是PNG和SVG(可缩放矢量图形(Scalable Vector Graphics)).
  • 安装
pip install qrcode

  • 示例 1
import qrcode 
img = qrcode.make('人生苦短,我用Python!') 
img.show()

效果如下图:

Python二维码的生成与识别详解编程语言
Python二维码的生成与识别详解编程语言
Python二维码的生成与识别详解编程语言

Python二维码的生成与识别详解编程语言

Python二维码的生成与识别详解编程语言

  • 示例 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()方法保存到本地

  •  效果如下图:

 
Python二维码的生成与识别详解编程语言

之所以这个图片中超过了21×21的大小,是因为数据内容“人生苦短,我用Python!”超过了version=1的大小,实际的结果是是version=3了。
具体的二维码(QRcode)容量的计算与版本的说明,可以参考如下地址的说明:
IT虾米网
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

Python二维码的生成与识别详解编程语言

示例代码如下:

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的二维码文件比较大。
详细介绍:
IT虾米网
  • 安装

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

 Python二维码的生成与识别详解编程语言

实现方式:
# -*- coding: utf-8 -*- 
from MyQR import myqr 
version,level,img_name = myqr.run('https://www.cnblogs.com/hyyx/') 
print(version,level,img_name)

  • 示例 2

 Python二维码的生成与识别详解编程语言

Python二维码的生成与识别详解编程语言

实现代码如下:

# -*- 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

Python二维码的生成与识别详解编程语言

 实现代码如下:

# -*- 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  图片的绝对路径

 
 
 
 

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/19723.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论