有趣的二维码:使用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对列表中的各项进行关联详解
Aug 15 Python
Python实现求数列和的方法示例
Jan 12 Python
Python中defaultdict与lambda表达式用法实例小结
Apr 09 Python
Python内存读写操作示例
Jul 18 Python
python爬虫基础教程:requests库(二)代码实例
Apr 09 Python
Python面向对象思想与应用入门教程【类与对象】
Apr 12 Python
Django中的静态文件管理过程解析
Aug 01 Python
Python 调用 Outlook 发送邮件过程解析
Aug 08 Python
Python3 翻转二叉树的实现
Sep 30 Python
使用TensorFlow直接获取处理MNIST数据方式
Feb 10 Python
详解Python IO口多路复用
Jun 17 Python
Python爬虫设置Cookie解决网站拦截并爬取蚂蚁短租的问题
Feb 22 Python
python保存大型 .mat 数据文件报错超出 IO 限制的操作
May 10 #Python
Python批量将csv文件转化成xml文件的实例
python基础之爬虫入门
python设置 matplotlib 正确显示中文的四种方式
提取视频中的音频 Python只需要三行代码!
Python-typing: 类型标注与支持 Any类型详解
May 10 #Python
超详细Python解释器新手安装教程
You might like
php实现与python进行socket通信的方法示例
2017/08/30 PHP
BOOM vs RR BO5 第二场 2.14
2021/03/10 DOTA
斜45度寻路实现函数
2009/08/20 Javascript
基于jquery的鼠标拖动效果代码
2012/05/30 Javascript
JavaScript中判断整字类型最简洁的实现方法
2014/11/08 Javascript
js实现交换运动效果的方法
2015/04/10 Javascript
JS自动倒计时30秒后按钮才可用(两种场景)
2015/08/31 Javascript
使用JQuery选择HTML遍历函数的方法
2016/09/17 Javascript
vue.js 左侧二级菜单显示与隐藏切换的实例代码
2017/05/23 Javascript
AngularJS获取json数据的方法详解
2017/05/27 Javascript
ng-repeat指令在迭代对象时的去重方法
2018/10/02 Javascript
微信小程序class封装http代码实例
2019/08/24 Javascript
浅谈js数组splice删除某个元素爬坑
2020/10/14 Javascript
wxPython窗口中文乱码解决方法
2014/10/11 Python
python实现生命游戏的示例代码(Game of Life)
2018/01/24 Python
深入理解Python爬虫代理池服务
2018/02/28 Python
对numpy 数组和矩阵的乘法的进一步理解
2018/04/04 Python
python dataframe 输出结果整行显示的方法
2018/06/14 Python
django ModelForm修改显示缩略图 imagefield类型的实例
2019/07/28 Python
Python简易版停车管理系统
2019/08/12 Python
tensorflow模型文件(ckpt)转pb文件的方法(不知道输出节点名)
2020/04/22 Python
python的json包位置及用法总结
2020/06/21 Python
微信小程序之html5 canvas绘图并保存到系统相册
2019/06/20 HTML / CSS
Tenstickers法国:墙贴和装饰贴纸
2019/08/26 全球购物
俄罗斯玩具、儿童用品、儿童服装和鞋子网上商店:MyToys.ru
2019/10/14 全球购物
MIRTA官网:手工包,100%意大利制造
2020/02/11 全球购物
最新英语专业学生求职信范文
2013/09/21 职场文书
计算机求职信
2013/12/01 职场文书
幼儿园教学管理制度
2014/02/04 职场文书
《维生素c的故事》教学反思
2014/02/18 职场文书
课堂打架检讨书200字
2014/11/21 职场文书
ktv服务员岗位职责
2015/02/09 职场文书
人工作失职检讨书
2015/05/05 职场文书
《地震中的父与子》教学反思
2016/02/16 职场文书
Nginx 安装SSL证书完成HTTPS部署
2022/04/28 Servers
spring IOC容器的Bean管理XML自动装配过程
2022/05/30 Java/Android