有趣的二维码:使用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 字符串格式化代码
Mar 17 Python
使用Python的Supervisor进行进程监控以及自动启动
May 29 Python
python开发之list操作实例分析
Feb 22 Python
python中将一个全部为int的list 转化为str的list方法
Apr 09 Python
python 输出上个月的月末日期实例
Apr 11 Python
python中subprocess批量执行linux命令
Apr 27 Python
解决python nohup linux 后台运行输出的问题
May 11 Python
python读取Excel实例详解
Aug 17 Python
33个Python爬虫项目实战(推荐)
Jul 08 Python
flask应用部署到服务器的方法
Jul 12 Python
python使用 request 发送表单数据操作示例
Sep 25 Python
python实现打砖块游戏
Feb 25 Python
python保存大型 .mat 数据文件报错超出 IO 限制的操作
May 10 #Python
Python批量将csv文件转化成xml文件的实例
python基础之爬虫入门
python设置 matplotlib 正确显示中文的四种方式
提取视频中的音频 Python只需要三行代码!
Python-typing: 类型标注与支持 Any类型详解
May 10 #Python
超详细Python解释器新手安装教程
You might like
在VS2008中编译MYSQL5.1.48的方法
2010/07/03 PHP
phpmyadmin安装时提示:Warning: require_once(./libraries/common.inc.php)错误解决办法
2011/08/18 PHP
Thinkphp中数据按分类嵌套循环实现方法
2014/10/30 PHP
php中PDO方式实现数据库的增删改查
2015/05/17 PHP
Thinkphp整合微信支付功能
2016/12/14 PHP
php处理静态页面:页面设置缓存时间实例
2017/06/22 PHP
JQUERY 浏览器判断实现函数
2009/08/20 Javascript
IE 上下滚动展示模仿Marquee机制
2009/12/20 Javascript
Jquery 获取对象的几种方式介绍
2014/01/17 Javascript
JavaScript fontcolor方法入门实例(按照指定的颜色来显示字符串)
2014/10/17 Javascript
jQuery+ajax实现无刷新级联菜单示例
2015/05/21 Javascript
jQuery+css实现的蓝色水平二级导航菜单效果代码
2015/09/11 Javascript
微信小程序  Mustache语法详细介绍
2016/10/27 Javascript
vue.js 使用v-if v-else发现没有执行解决办法
2017/05/15 Javascript
微信小程序Redux绑定实例详解
2017/06/07 Javascript
Node.js中Bootstrap-table的两种分页的实现方法
2017/09/18 Javascript
p5.js入门教程之图片加载
2018/03/20 Javascript
JavaScript实现小球沿正弦曲线运动
2020/09/07 Javascript
vue实现简易图片左右旋转,上一张,下一张组件案例
2020/07/31 Javascript
浅谈vue 二级路由嵌套和二级路由高亮问题
2020/08/06 Javascript
Vue 按照创建时间和当前时间显示操作(刚刚,几小时前,几天前)
2020/09/10 Javascript
[46:44]VG vs TNC Supermajor小组赛B组败者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
基于Python如何使用AIML搭建聊天机器人
2016/01/27 Python
浅谈Django学习migrate和makemigrations的差别
2018/01/18 Python
Python解决走迷宫问题算法示例
2018/07/27 Python
python调用百度REST API实现语音识别
2018/08/30 Python
判断python对象是否可调用的三种方式及其区别详解
2019/01/31 Python
利用HTML5中的Canvas绘制一张笑脸的教程
2015/05/07 HTML / CSS
英国在线花园中心:You Garden
2018/06/03 全球购物
劳资人员岗位职责
2013/12/19 职场文书
新娘父亲婚礼致辞
2014/01/16 职场文书
《明天,我们毕业》教学反思
2014/04/24 职场文书
2014高中生入党思想汇报范文
2014/09/13 职场文书
校园新闻广播稿5篇
2014/10/10 职场文书
个人自我鉴定怎么写?
2019/07/01 职场文书
php png失真的原因及解决办法
2021/10/24 PHP