有趣的二维码:使用MyQR和qrcode来制作二维码


Posted in Python onMay 10, 2021

前言

  今天下午无聊,突发奇想想玩玩二维码,于是就结合着上学期学的标识技术,用Python制作了一下二维码。

1. 二维码

  二维码 ( 2 − D i m e n s i o n a l (2-Dimensional (2Dimensional B a r c o d e ) Barcode) Barcode),又称二维条形码。它是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形来记录数据符号信息的;在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理。

  一维条形码,就是我们日常所说的条形码 ( B a r c o d ) (Barcod) (Barcod),常见于食品包装上。它是将宽度不等的多个黑条和空白,按一定的编码规则排列,用以表达一组信息的图形标识符。常见的一维条形码是由黑条(简称条)和白条(简称空)排成平行线图案。条形码可以标出物品的生产国、制造厂家、商品名称、生产日期以及图书分类号、邮件起止地点、类别、日期等信息。
  通常一维条形码所能表示的字符集不过10个数字、26个英文字母及一些特殊字符,条码字符集最大所能表示的字符个数为128个ASCII字符,信息量非常有限。

  二维码有其特定的字符集,每个字符占有一定的宽度,每种码具有一定的校验功能,同时还具有对不同行的信息自动识别功能、及处理图形旋转变化等特点。
  二维条形码是在二维空间水平和竖直方向存储信息的条形码。它的优点是信息容量大,译码可靠性高,纠错能力强,制作成本低,保密与防伪性能好。
  目前,世界上应用最多的二维条码符号有 A z t e c Aztec Aztec C o d e Code Code P D F 147 PDF147 PDF147 D a t a M a t r i x DataMatrix DataMatrix Q R QR QR C o d e Code Code C o d e 16 K Code16K Code16K等。
有趣的二维码:使用MyQR和qrcode来制作二维码
  常见的二维码为 Q R QR QR C o d e Code Code Q R QR QR全称是 Q u i c k Quick Quick R e s p o n s e Response Response,是一个近几年来移动设备上超流行的一种编码方式。它的结构如下:

有趣的二维码:使用MyQR和qrcode来制作二维码
  QR Code属于矩阵式二维条码,又称棋盘式二维条码。它是在一个矩形空间通过黑、白像素在矩阵中的不同分布进行编码。在矩阵相应元素位置上,用点(方点、圆点或其他形状)的出现表示二进制“1”,点的不出现表示二进制的“0”,点的排列组合确定了矩阵式二维条码所代表的意义。
  主要有以下特点:
  1. 符号规格从版本1(21×21)到版本40(177×177),每提高一个版本,每边增加4个码元(即指构成QR码的方形黑白点);
  2. 信息容量大:能存储7089个数字字符或4296个字母字符或2953个8位字节字符或1817汉字字符;
  3. 纠错能力强:即使部分编码变脏或破损,也可以恢复数据。L级约可纠错7%的数据码字,M级约可纠错15%的数据码字,Q级约可纠错25%的数据码字,H级约可纠错30%的数据码字;
  4. 可以从任意方向读取:QR码可以从360°任一方向均可快速读取。通过QR码中的三处定位图案,可以帮助QR码不受背景样式的影响,实现快速稳定的读取。


上述材料来源于《物联网技术基础教程》/李联宁编著.清华大学出版社,2012.6

2. MyQR

  有关更详细MyQR的操作,可以参阅官方文档

  MyQR可以生成常见的二维码、艺术二维码(黑白或彩色), 动态二维码(黑白或彩色),安装命令如下:

pip install MyQR
参数 类型 说明
w o r d s words words s t r str str 二维码的内容
v e r s i o n version version i n t int int 1 − 40 1-40 140,控制二维码的大小,默认是 1 1 1,即 21 × 21 21\times21 21×21
l e v e l level level s t r str str ′ L ′ , ′ M ′ , ′ Q ′ , ′ H ′ 'L','M','Q','H' L,M,Q,H,选一个,默认是 L L L
p i c u t r e picutre picutre s t r str str 图片的文件名,默认为空,即生成的二维码是普通的二维码
c o l o r i z e d colorized colorized b o o l bool bool 默认是 F a l s e False False,即生成的二维码是黑白的
c o n s t r a s t constrast constrast f l o a t float float 对比度,默认是 1.0 1.0 1.0
b r i g h t n e s s brightness brightness f l o a t float float 亮度,默认是 1.0 1.0 1.0
s a v e _ n a m e save\_name save_name s t r str str 输出的文件名,比如 ′ e x a m p l e . p n g ′ 'example.png' example.png
s a v e _ d i r save\_dir save_dir s t r str str 输出的文件路径,默认为当前路径

  代码如下:

if __name__ == '__main__':
    version, level, qr_name = myqr.run(
        words='https://blog.csdn.net/qq_42730750',
        version=1,
        level='H',
        picture='./XKD.gif',
        colorized=True,
        contrast=1.0,
        brightness=1.0,
        save_name='test4.gif',
        save_dir=os.getcwd()
    )
    print(version)
    print(level)
    print(qr_name)

  这是我生成的几个二维码:
有趣的二维码:使用MyQR和qrcode来制作二维码
有趣的二维码:使用MyQR和qrcode来制作二维码
有趣的二维码:使用MyQR和qrcode来制作二维码
有趣的二维码:使用MyQR和qrcode来制作二维码
  MyQR确实是挺好用的,唯一的缺点就是,不支持中文!!!没错,是不是有点遗憾,它只支持以下字符:

  • 数字 0 到 9
  • 大小写的英文字母
  • 常用英文标点符号和空格
· , . : ; + - * / \ ~ ! @ # $ % ^ & ` ' = < > [ ] ( ) ? _ { } | and  (space)

3. qrcode

  有关更详细qrcode的操作,可以参阅官方文档

  qrcode的功能虽稍逊于MyQR,但是它支持中文字符,且能生成矢量图,安装命令如下:

pip install qrcode
参数 类型 说明
v e r s i o n version version i n t int int 1 − 40 1-40 140,控制二维码的大小,默认是 1 1 1,即 21 × 21 21\times21 21×21
e r r o r _ c o r r e c t i o n error\_correction error_correction c o n s t a n t s constants constants 用于QR码的错误校正,默认 q r c o d e . c o n s t a n t s . E R R O R _ C O R R E C T _ L qrcode.constants.ERROR\_CORRECT\_L qrcode.constants.ERROR_CORRECT_L,即 L L L
b o x _ s i z e box\_size box_size i n t int int 控制QR码的每个格子有多少像素,默认为10
b o r d e r border border i n t int int 控制边框(空白区)的格子宽度,默认为4
f i l l _ c o l o r fill\_color fill_color s t r str str 二维码的绘制色,默认为 ′ b l a c k ′ 'black' black
b a c k _ c o l o r back\_color back_color s t r str str 二维码的背景色,默认为 ′ w h i t e ′ 'white' white

  代码如下:

def mergeImg(img1, img2, flag=True):
    """
    合并图像
    :param img1:
    :param img2:
    :param flag: True 表示将logo居中, False 表示将logo作为背景图
    :return:
    """
    img1_w, img1_h = img1.size
    if flag:
        img2_w = int(img2.size[0] / 3)
        img2_h = int(img2.size[1] / 3)
        # 缩放logo
        img2 = img2.resize(size=(img2_w, img2_h), resample=Image.ANTIALIAS)
        # 将logo居中显示
        img1.paste(im=img2, box=(int((img1_w - img2_w) / 2), int((img1_h - img2_h) / 2)))
        img1.save('./test8.png')
    else:
        img2 = img2.resize(size=(img1_w, img1_h), resample=Image.ANTIALIAS)
        # 两张图片的size和mode要一致
        # 计算公式为out = image1 * (1.0 - alpha) + image2 * alpha
        # 这里的背景色就是一种干扰了, 如果将二维码的透明度设置过高会识别不出来
        out_img = Image.blend(img1, img2, alpha=0.3)
        out_img.save('./test9.png')


if __name__ == '__main__':
    qr = qrcode.QRCode(
        version=1,
        error_correction=qrcode.constants.ERROR_CORRECT_H,
        box_size=10,
        border=4,
    )
    qr.add_data('这是我的博客地址: https://blog.csdn.net/qq_42730750')
    qr.make(fit=True)

    # black green purple orange pink white blue
    # make_image() 返回的是一个PilImage对象
    # 可以使用pillow对它进行图像处理相关的操作
    # img1 = qr.make_image(fill_color="#8A2BE2", back_color="white")
    img1 = qr.make_image(fill_color="orange", back_color="white").convert('RGB')
    # img1.show()
    # img1.save('./test6.png')

    img2 = Image.open('./cutcamera.png').convert('RGB')
    mergeImg(img1, img2, flag=True)

  这是我生成的几个二维码:
有趣的二维码:使用MyQR和qrcode来制作二维码
有趣的二维码:使用MyQR和qrcode来制作二维码
有趣的二维码:使用MyQR和qrcode来制作二维码
有趣的二维码:使用MyQR和qrcode来制作二维码

  有关更多 P I L . I m a g e PIL.Image PIL.Image的操作,请参考官方文档

Python 相关文章推荐
使用Python开发windows GUI程序入门实例
Oct 23 Python
Python算法输出1-9数组形成的结果为100的所有运算式
Nov 03 Python
Python 移动光标位置的方法
Jan 20 Python
学习python的前途 python挣钱
Feb 27 Python
Python 调用 Windows API COM 新法
Aug 22 Python
Python爬虫之urllib基础用法教程
Oct 12 Python
Django 解决distinct无法去除重复数据的问题
May 20 Python
零基础小白多久能学会python
Jun 22 Python
解决Windows下python和pip命令无法使用的问题
Aug 31 Python
python 服务器运行代码报错ModuleNotFoundError的解决办法
Sep 16 Python
python 实现压缩和解压缩的示例
Sep 22 Python
接口自动化多层嵌套json数据处理代码实例
Nov 20 Python
python保存大型 .mat 数据文件报错超出 IO 限制的操作
May 10 #Python
Python批量将csv文件转化成xml文件的实例
python基础之爬虫入门
python设置 matplotlib 正确显示中文的四种方式
提取视频中的音频 Python只需要三行代码!
Python-typing: 类型标注与支持 Any类型详解
May 10 #Python
超详细Python解释器新手安装教程
You might like
Linux环境下搭建php开发环境的操作步骤
2013/06/17 PHP
yii操作cookie实例简介
2014/07/09 PHP
laravel 框架实现无限级分类的方法示例
2019/10/31 PHP
Laravel统一错误处理为JSON的方法介绍
2020/10/18 PHP
PNG背景在不同浏览器下的应用
2009/06/22 Javascript
跟着Jquery API学Jquery之一 选择器
2010/04/07 Javascript
jQuery中parentsUntil()方法用法实例
2015/01/07 Javascript
JavaScript实现数组在指定位置插入若干元素的方法
2015/04/06 Javascript
原生js实现移动开发轮播图、相册滑动特效
2015/04/17 Javascript
Js调用Java方法并互相传参的简单实例
2016/08/11 Javascript
Bootstrap基本样式学习笔记之表格(2)
2016/12/07 Javascript
用jquery的attr方法实现图片切换效果
2017/02/05 Javascript
Vue组件开发初探
2017/02/14 Javascript
JS实现一个简单的日历
2017/02/22 Javascript
node.js平台下的mysql数据库配置及连接
2017/03/31 Javascript
vue.js获取数据库数据实例代码
2017/05/26 Javascript
JavaScript实现一个简易的计算器实例代码
2018/05/10 Javascript
微信小程序开发之自定义tabBar的实现
2018/09/06 Javascript
浅谈JavaScript闭包
2019/04/09 Javascript
vue动态子组件的两种实现方式
2019/09/01 Javascript
Python实现给文件添加内容及得到文件信息的方法
2015/05/28 Python
python中import reload __import__的区别详解
2017/10/16 Python
Python反射和内置方法重写操作详解
2018/08/27 Python
python+splinter实现12306网站刷票并自动购票流程
2018/09/25 Python
攻击者是如何将PHP Phar包伪装成图像以绕过文件类型检测的(推荐)
2018/10/11 Python
利用Python绘制有趣的万圣节南瓜怪效果
2019/10/31 Python
Python selenium抓取虎牙短视频代码实例
2020/03/02 Python
python爬虫搭配起Bilibili唧唧的流程分析
2020/12/01 Python
自考生毕业自我鉴定
2013/10/10 职场文书
房地产销售员的自我评价分享
2013/12/04 职场文书
《我为你骄傲》教学反思
2014/02/20 职场文书
付款承诺函范文
2015/01/21 职场文书
小学远程教育工作总结
2015/08/13 职场文书
Rust 连接 PostgreSQL 数据库的详细过程
2022/01/22 PostgreSQL
「睡美人」爱洛公主粘土人开订
2022/03/22 日漫
HTML CSS 一个标签实现带动画的抖音LOGO
2022/04/26 HTML / CSS