有趣的二维码:使用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 相关文章推荐
用pywin32实现windows模拟鼠标及键盘动作
Apr 22 Python
简化Python的Django框架代码的一些示例
Apr 20 Python
Python遍历文件夹和读写文件的实现代码
Aug 28 Python
flask + pymysql操作Mysql数据库的实例
Nov 13 Python
python读取文件名并改名字的实例
Jan 07 Python
python selenium爬取斗鱼所有直播房间信息过程详解
Aug 09 Python
Python3 JSON编码解码方法详解
Sep 06 Python
python中property和setter装饰器用法
Dec 19 Python
nginx搭建基于python的web环境的实现步骤
Jan 03 Python
Python3 全自动更新已安装的模块实现
Jan 06 Python
Python中私有属性的定义方式
Mar 05 Python
基于SQLAlchemy实现操作MySQL并执行原生sql语句
Jun 10 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读取PPT文件的方法
2015/12/10 PHP
php中二分法查找算法实例分析
2016/09/22 PHP
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
阿里云的WindowsServer2016上部署php+apache
2018/07/17 PHP
HTTP头隐藏PHP版本号实现过程解析
2020/12/09 PHP
禁止刷新,回退的JS
2006/11/25 Javascript
使用隐藏的new来创建对象
2011/03/29 Javascript
javascript中String类的subString()方法和slice()方法
2011/05/24 Javascript
jQuery输入城市查看地图使用介绍
2013/05/08 Javascript
jQuery实现的表头固定效果实例【附完整demo源码下载】
2016/08/01 Javascript
使用bootstrap实现多窗口和拖动效果
2016/09/22 Javascript
javascript checkbox/radio onchange不能兼容ie8处理办法
2017/06/13 Javascript
w3c编程挑战_初级脚本算法实战篇
2017/06/23 Javascript
最简单的JS实现json转csv的方法
2019/01/10 Javascript
Easyui 去除jquery-easui tab页div自带滚动条的方法
2019/05/10 jQuery
详解elementui之el-image-viewer(图片查看器)
2019/08/30 Javascript
JavaScript 实现下雪特效的示例代码
2020/09/09 Javascript
[02:50]【扭转乾坤,只此一招】DOTA2永雾林渊版本开启新篇章
2020/12/22 DOTA
推荐下python/ironpython:从入门到精通
2007/10/02 Python
详细介绍Python的鸭子类型
2016/09/12 Python
Python实现的计算器功能示例
2018/04/26 Python
Python实现的绘制三维双螺旋线图形功能示例
2018/06/23 Python
Python合并多个Excel数据的方法
2018/07/16 Python
Django接收post前端返回的json格式数据代码实现
2019/07/31 Python
python OpenCV GrabCut使用实例解析
2019/11/11 Python
Python 中判断列表是否为空的方法
2019/11/24 Python
Python实现动态给类和对象添加属性和方法操作示例
2020/02/29 Python
SpringBoot实现登录注册常见问题解决方案
2020/03/04 Python
三步解决python PermissionError: [WinError 5]拒绝访问的情况
2020/04/22 Python
html5 canvas绘制矩形和圆形的实例代码
2016/06/16 HTML / CSS
html5 canvas绘制网络字体的常用方法
2019/08/26 HTML / CSS
德国古洛迷亚百货官网:GALERIA Kaufhof
2017/06/20 全球购物
英国绿色商店:Natural Collection
2019/05/03 全球购物
财务工作者先进事迹材料
2014/01/17 职场文书
2015学校师德师风工作总结
2015/04/22 职场文书
预备党员群众意见
2015/06/01 职场文书