有趣的二维码:使用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实现排序算法
Feb 14 Python
Python实现动态添加类的属性或成员函数的解决方法
Jul 16 Python
Python获取Linux系统下的本机IP地址代码分享
Nov 07 Python
简单谈谈Python中的json与pickle
Jul 19 Python
python 调用有道api接口的方法
Jan 03 Python
使用OpenCV实现仿射变换—旋转功能
Aug 29 Python
详解Django admin高级用法
Nov 06 Python
python实现简易淘宝购物
Nov 22 Python
通过python检测字符串的字母
Feb 18 Python
flask项目集成swagger的方法
Dec 09 Python
Python实现简单的2048小游戏
Mar 01 Python
新手必备Python开发环境搭建教程
May 28 Python
python保存大型 .mat 数据文件报错超出 IO 限制的操作
May 10 #Python
Python批量将csv文件转化成xml文件的实例
python基础之爬虫入门
python设置 matplotlib 正确显示中文的四种方式
提取视频中的音频 Python只需要三行代码!
Python-typing: 类型标注与支持 Any类型详解
May 10 #Python
超详细Python解释器新手安装教程
You might like
《星际争霸》各版本雷兽特点图文解析 雷兽不同形态一览
2020/03/02 星际争霸
使用sockets:从新闻组中获取文章(二)
2006/10/09 PHP
深入php多态的实现详解
2013/06/09 PHP
(PHP实现)只使用++运算实现加法,减法,乘法,除法
2013/06/27 PHP
PHP的构造方法,析构方法和this关键字详细介绍
2013/10/22 PHP
PHP清除数组中所有字符串两端空格的方法
2014/10/20 PHP
php从身份证获取性别和出生年月
2017/02/09 PHP
thinkPHP5框架实现多数据库连接,跨数据连接查询操作示例
2019/05/29 PHP
Laravel 5.5 实现禁用用户注册示例
2019/10/24 PHP
JavaScript中常见陷阱小结
2010/04/27 Javascript
Zero Clipboard实现浏览器复制到剪贴板的方法(多个复制按钮)
2016/03/24 Javascript
js封装tab标签页实例分享
2016/12/19 Javascript
Vue2.0 UI框架ElementUI使用方法详解
2017/04/14 Javascript
JavaScript 获取元素在父节点中的下标(推荐)
2017/06/28 Javascript
详解vuex中mapState,mapGetters,mapMutations,mapActions的作用
2018/04/13 Javascript
Vue组件之极简的地址选择器的实现
2018/05/31 Javascript
用原生 JS 实现 innerHTML 功能实例详解
2019/04/03 Javascript
Python导出DBF文件到Excel的方法
2015/07/25 Python
python实现二叉树的遍历
2017/12/11 Python
对pandas replace函数的使用方法小结
2018/05/18 Python
Django 数据库同步操作技巧详解
2019/07/19 Python
使用Python实现图像标记点的坐标输出功能
2019/08/14 Python
用Python画小女孩放风筝的示例
2019/11/23 Python
tensorflow使用range_input_producer多线程读取数据实例
2020/01/20 Python
浅谈django channels 路由误导
2020/05/28 Python
什么叫应用程序域?什么是托管代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?
2012/05/23 面试题
linux面试题参考答案(2)
2015/12/06 面试题
护士自荐信
2013/10/25 职场文书
银行会计业务的个人自我评价
2013/11/02 职场文书
优秀大学生求职自荐信范文
2014/04/19 职场文书
领导班子个人对照检查材料(群众路线)
2014/09/26 职场文书
交通运输局四风问题对照检查材料思想汇报
2014/10/09 职场文书
2015年教师个人业务工作总结
2015/10/23 职场文书
一篇文章弄懂MySQL查询语句的执行过程
2021/05/07 MySQL
浅谈Python从全局与局部变量到装饰器的相关知识
2021/06/21 Python
什么是css原子化,有什么用?
2022/04/24 HTML / CSS