二维码简称 QR Code(Quick Response Code),学名为快速响应矩阵码,是二维条码的一种,由日本的 Denso Wave 公司于 1994 年发明。现随着智能手机的普及,已广泛应用于平常生活中,例如商品信息查询、社交好友互动、网络地址访问等等。
在Python中生成二维码可以使用 qrcode 模块,由于生成 qrcode 图片需要依赖 Python 的图像库,所以需要先安装 Python 图像库 PIL(Python Imaging Library),不然会遇到 “ImportError: No module named Image” 的错误,但是,因为 PIL库 现在的状态是:
The current free version is PIL 1.1.7. This release supports Python 1.5.2 and newer, including 2.5 and 2.6. A version for 3.X will be released later.
所以,我现在在需要使用Python图像库的时候一般是用 Pillow 模块代替PIL(Pillow is the “friendly” PIL fork,而且Pillow的出现就是为了解决 PIL 的两个问题:1.不兼容 setuptools;2.报告的问题太多,而更新太慢),安装非常简单:
pip install pillow
然后要在import Image的Python代码中将其改为:from PIL import Image 即可。
安装 qrcode 也是类似:
pip install qrcode
在Linux系统下成功安装后,即可以在终端里使用 qr 命令/脚本生成二维码了:
qr "Just a test" > test.png qr --help
在Python中也可以用如下的方式快速生成:
import qrcode img = qrcode.make('Some data here')
更高级一些的设置需要在Python中引入QRCode类:
示例代码1:
#!/usr/bin/env python #coding=utf-8 import qrcode qr = qrcode.QRCode( version=2, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=10, border=1 ) qr.add_data("http://ixyzero.com/") qr.make(fit=True) img = qr.make_image() img.save("crazyofme_qrcode.png")
参数 version 表示生成二维码的尺寸大小,取值范围是 1 至 40,最小尺寸 1 会生成 21 * 21 的二维码矩阵,version 每增加 1,生成的二维码就会添加 4 个单位大小,例如 version 是 2,则生成 25 * 25 尺寸大小的二维码。
参数 error_correction 指定二维码的容错系数,分别有以下4个系数:
- ERROR_CORRECT_L: 7%的字码可被容错
- ERROR_CORRECT_M: 15%的字码可被容错
- ERROR_CORRECT_Q: 25%的字码可被容错
- ERROR_CORRECT_H: 30%的字码可被容错
参数 box_size 表示二维码里每个格子的像素大小。
参数 border 表示边框的格子宽度是多少(默认是4)。
示例代码2(生成带有图标的二维码):
#!/usr/bin/env python #coding=utf-8 from PIL import Image import qrcode qr = qrcode.QRCode( version=2, error_correction=qrcode.constants.ERROR_CORRECT_Q, box_size=10, border=1 ) qr.add_data("http://ixyzero.com/blog/") qr.make(fit=True) img = qr.make_image() img = img.convert("RGBA") img_w, img_h = img.size factor = 3 size_w = int(img_w / factor) size_h = int(img_h / factor) icon = Image.open("apple.png") icon_w, icon_h = icon.size if icon_w > size_w: icon_w = size_w if icon_h > size_h: icon_h = size_h icon = icon.resize((icon_w, icon_h), Image.ANTIALIAS) w = int((img_w - icon_w) / 2) h = int((img_h - icon_h) / 2) img.paste(icon, (w, h), icon) img.save("crazyofmeBlog_qrcode.png")
上面这段示例代码会生成包含有本博客链接“http://ixyzero.com/blog/”内容的二维码矩阵(并且嵌入/粘上了自己指定的图片apple.png):
大家可以将其替换为自己的网站图标以体现个性。不过在此之前友情提醒一下:参数error_correction 和 粘贴图标的大小尺寸与二维码长宽的比例factor,两者之间有些微妙的关系,别把自己的图标设置的太大导致二维码无法被识别那就得不偿失了。原因是:
二维码的容错系数(上面所指的 error_correction)越高,生成的二维码则可允许的残缺率越大,且二维码的数据主要保存在图片的四个角上,所以在二维码中间放一个小图标,对二维码的识别也是不受多大影响的。
对于插入在二维码上的图标大小,这里指定限制图标的大小尺寸最大是二维码长宽的 1/4,以免残缺太大,影响识别。
还可以借助qrcode模块生成其他类型的图片,比如:SCG、纯Python生成的PNG,可以参考官方说明。
参考链接:
- Python 的生成二维码生成库 — qrcode
- lincolnloop/python-qrcode
- Python使用qrcode模块生成二维码
- python qrcode生成
- Python and QRCodes | python, qrcodes
上面说明了如何用Python制作二维码图片,但是,怎么从已有的二维码图片中读取其中包含的信息呢?通过网上的搜索以及实践,方法有三:
- 在线识别:http://cli.im/deqr/ 和 http://www.deqr.net/
- 使用ZBar:项目地址
- 利用Python:
#!/usr/bin/env python # coding: utf-8 import sys, qrcode d = qrcode.Decoder() if d.decode('crazyofme.png'): print 'result: ' + d.result else: print 'error: ' + d.error
但是使用的时候会提示错误“AttributeError: ‘module’ object has no attribute ‘Decoder’”,利用IPython查看引入的qrcode模块都有哪些方法:
In [1]: import qrcode In [2]: qrcode. qrcode.ERROR_CORRECT_H qrcode.base qrcode.make qrcode.ERROR_CORRECT_L qrcode.constants qrcode.run_example qrcode.ERROR_CORRECT_M qrcode.exceptions qrcode.util qrcode.ERROR_CORRECT_Q qrcode.image qrcode.QRCode qrcode.main
很明显,没有Decoder这个方法,估计是安装的qrcode包不同导致,反正后来也没有深究了,因为折腾了好久都没弄好+优先级不高,纯粹玩票性质,所以就不多扯了,以后如果实在有需要再弄吧,先记录一些看到的还不错的链接:
http://www.pythontr.com/makale.py?tid=177
http://code.google.com/p/qr-code-api/
自己在Windows上编译安装pyqrcode模块的大体方法(坑爹的MinGW):http://stackoverflow.com/questions/9310280/qr-code-decoder-library-for-python
《 “用Python的qrcode模块生成二维码” 》 有 11 条评论
互联网上的一些公共API列表收集
https://github.com/abhishekbanthia/Public-APIs
微信网页版扫码登录是如何实现的?
http://www.jianshu.com/p/7f072ac61763
http://blog.csdn.net/stpeace/article/details/77838832
产品经理小技术(三):二维码这把利刃,产品应该用到极致
http://uxfeng.com/product_qrcode/
用 Python 实现在命令行生成二维码
https://github.com/RitterHou/Lilith
聊聊二维码登录
https://segmentfault.com/a/1190000012446715
`
序
场景
步骤
PC客户端
手机客户端
服务端
实现
PC端如何自动登录
二维码过期
安全问题
原理
防范
小结
doc
`
[…] 原文链接:用Python的qrcode模块生成二维码 | ASPIRE […]
QR Code Generator CONVERT ANYTHING 2QR.COEDS
https://2qr.codes/#wifi
让你的二维码,简单一点
https://sspai.com/post/72727
`
# 当你扫码时,手机发生了什么
二维码的内容是一段文本,这些文本通过不同的前缀可以被手机识别为不同的数据类型。
以 iPhone 为例,使用自带的相机,或其它二维码识别 app 对二维码进行扫描的时候,会首先判断识别到的内容前缀,然后通过相应的 app 来打开该内容。如果是纯文本,则会使用 Safari 浏览器进行搜索。
而文本如果以 https:// 开头,就代表了该二维码是一个网址,在进行扫码的时候会自动通过 Safari 打开该链接。其它超链接诸如 mailto:[email protected](发邮件)、tel:10010(打电话)、smsto:10010(发短信),以及 URL Scheme 等这类第三方应用接口,也会让手机调用相关的 app 来执行。而通过 WIFI: 这个前缀还可以使用户直接扫码联网(对于可以共享 WiFi 密码的安卓手机,通常会生成一个二维码供其他手机扫描,而通过微信扫码后则可以看到其中的 WiFi 密码)。
但是多数情况下我们用来扫码的工具都是微信,而微信支持的只有文本与网页链接,且仅会调用微信内置的浏览器打开网址,这就大大限制了二维码的使用场景,本文也仅针对网址类的二维码进行简化的讨论。
# 什么决定了二维码的复杂度
影响二维码复杂度的两个属性分别是「内容长度」与「容错率」。
内容长度:顾名思义,二维码中所包含的文本长度决定了二维码画面的复杂度,文本越长二维码越复杂,反之则越简单。
容错率:二维码的容错率设置为四个等级:L – 低容错率、M – 中等容错率、Q – 较高容错率、H – 高容错率,其中级别为 L 的容错率为 7%,M 容错率为 15%,Q 容错率为 25%,H 容错率为 30%,假如一个二维码在生成时设定容错率为 L 级别,那么生成的二维码被遮挡的内容超过 7% 就无法识别。而越是高容错的二维码看起来越是复杂,我们最常见的二维码多数采用了 M 等级的容错率,保证一定容错的情况下尽可能使二维码趋于简单。
# 为何要简化二维码
美观:作为一名平面设计师,简单的二维码比起密密麻麻的复杂二维码看起来更为透气,也更容易与其它设计元素搭配。所以我在处理包含二维码的设计工作时,会尽量重制二维码让其变的更为简单美观。
提高识别度:前文提到说越是复杂的二维码容错越高,这里并非背道而驰。相较于高容错率,更简单的低容错二维码在线下介质的适应性上,要好于更复杂的二维码。有时候我们的二维码扫不出,不是因为二维码某个位置损毁脏污,而是因为部分介质较低的印刷精度,以及扫描距离的关系,导致低端的手机镜头整体无法识别。
二次创作:随着二维码逐渐被重视,一些专业的设计师,将二维码重新设计,使其看起来更具创意却依然能保证功能性。而这些再次创作的二维码越是简单,就越容易被重画。
`
Mac 下 终端也能生成二维码了
https://droidyue.com/blog/2022/05/30/generate-qrcode-in-terminal-on-mac-or-linux/
`
# 安装
brew install qrencode
# 命令手册
man qrencode
qrencode – Encode input data in a QR Code and save as a PNG or EPS image.
qrencode [-o FILENAME] [OPTION]… [STRING]
-t {PNG,PNG32,EPS,SVG,XPM,ANSI,ANSI256,ASCII,ASCIIi,UTF8,UTF8i,ANSIUTF8,ANSIUTF8i,ANSI256UTF8}
–type={PNG,PNG32,EPS,SVG,XPM,ANSI,ANSI256,ASCII,ASCIIi,UTF8,UTF8i,ANSIUTF8,ANSIUTF8i,ANSI256UTF8}
specify the type of the generated image. (default=PNG)
-l {LMQH}, –level={LMQH}
specify error correction level from L (lowest) to H (highest). (default=L)
-m NUMBER, –margin=NUMBER
specify the width of margin. (default=4)
# 使用样例
qrencode -t ANSIUTF8 https://ixyzero.com/
`
Defining a Custom URL Scheme for Your App (Use specially formatted URLs to link to content within your app)
https://developer.apple.com/documentation/xcode/defining-a-custom-url-scheme-for-your-app
Complete List of iOS URL Schemes for Apple Apps and Services (Always-Updated)
https://medium.com/@contact.jmeyers/complete-list-of-ios-url-schemes-for-apple-apps-and-services-always-updated-800c64f450f
Complete List of iOS URL Schemes for Apple Settings (Always-Updated)
https://medium.com/@contact.jmeyers/complete-list-of-ios-url-schemes-for-apple-settings-always-updated-20871139d72f
Find the URL scheme of an app on my iPhone
https://stackoverflow.com/questions/52318063/find-the-url-scheme-of-an-app-on-my-iphone
URL Scheme 查询指南
https://sspai.com/post/66334
含参数的 URL Scheme 收集.md
https://gist.github.com/JamesHopbourn/046bc341e7debfd0c86e3b388d983c53
如何寻找一个 App 的 URL Schemes
https://zhuanlan.zhihu.com/p/53439246
URL Schemes 收集整理
https://jiejinghe.com/posts/7887440252
[…] 从“让你的二维码,简单一点”这篇文章开始说起,里面有一段内容是介绍【当你扫码时,手机发生了什么】的,对于iPhone来说,其实是URL Scheme的概念,然后又提到了二维码的几个使用场景,让我想起了以前看过的几篇帖子/文章(【用Python的qrcode模块生成二维码】/【过年回老家,亲朋好友来串门使用 WiFi 太麻烦,写了一个 WiFi 管理和分享的小工具,欢迎大家使用】/【Mac 下 终端也能生成二维码了】),觉得里面有些内容还挺有意思的,而且相互之间还可以串起来,所以简单汇总记录一下,方便后面有需要的时候参考。 […]
[…] 原文链接: 用Python的qrcode模块生成二维码 | ASPIRE […]