# 聊聊Python里的二维码生成
二维码这东西现在随处可见,付款、加好友、下载App,扫一下就行。但你知道怎么用Python自己生成二维码吗?今天就来聊聊qrcode这个库。
他是什么
qrcode是Python里一个专门用来生成二维码的库。说白点,它能把一段文字、一个网址,或者其他什么信息,转换成那些黑白小方块组成的图案。这库挺轻量的,核心功能就一个——生成二维码图片,不搞什么花里胡哨的。
有意思的是,这个库底层其实依赖另一个叫Pillow的库来处理图片。但qrcode把生成二维码的复杂逻辑都封装好了,用起来特别简单。你不需要懂二维码的编码原理,也不需要知道那些纠错码怎么算,调用几个函数就能搞定。
他能做什么
最直接的当然是生成二维码图片了。但别小看这个功能,实际用起来场景还挺多的。
比如给网站生成分享二维码。有些时候用户可能是在电脑上浏览你的网站,但想转到手机上看,这时候在页面角落放个二维码,扫一下就能在手机上打开,体验会好很多。再比如生成电子票务的二维码,用户下单后直接生成一个二维码发过去,现场扫一下就能核销。
还有个挺实用的场景是生成Wi-Fi连接的二维码。现在很多路由器管理界面都能生成这种二维码,手机一扫就能连上Wi-Fi,不用手动输密码。用qrcode也能实现这个功能,生成特定格式的字符串就行。
甚至可以用来做简单的信息传递。比如把一段较长的配置信息生成二维码,设备扫一下就能读取配置。这在物联网设备初始化时挺有用的。
怎么使用
用qrcode生成二维码简单得有点不像话。先安装库,用pip就行:pip install qrcode[pil]。后面那个[pil]是为了确保把图片处理的依赖也装上。
最基本的用法就三行代码:
importqrcode img=qrcode.make('https://www.example.com')img.save('qrcode.png')这样就在当前目录生成了一个包含网址的二维码图片。如果想控制更多参数,比如二维码大小、纠错级别,可以用QRCode类:
importqrcode qr=qrcode.QRCode(version=1,error_correction=qrcode.constants.ERROR_CORRECT_L,box_size=10,border=4,)qr.add_data('https://www.example.com')qr.make(fit=True)img=qr.make_image(fill_color="black",back_color="white")img.save('detailed_qrcode.png')这里的参数可以调整二维码的细节。version控制二维码的大小版本,从1到40,数字越大二维码越复杂,能存储的信息越多。error_correction是纠错级别,分L、M、Q、H四级,级别越高纠错能力越强,但二维码也会更密集。如果二维码可能会被部分遮挡或者打印质量不太好,建议用高纠错级别。
box_size是每个小方块包含的像素数,border是边框的宽度。调整这些可以让生成的二维码在不同场景下都有好的识别效果。
颜色也是可以自定义的,不一定非得是黑白的。比如可以生成蓝底白块的二维码,或者用公司品牌色。不过要注意对比度,颜色太接近的话手机可能扫不出来。
最佳实践
生成二维码虽然简单,但有些细节不注意的话,实际用起来可能会出问题。
首先是内容长度要控制。二维码能存储的信息量有限,版本1的二维码最多只能存储几十个字符。如果内容太长,库会自动选择更高的版本,但二维码会变得很密集,识别起来可能困难。一般来说,网址的话尽量用短链接,文字内容也尽量精简。
纠错级别的选择要看使用场景。如果是打印出来贴在户外的海报上,可能会被日晒雨淋导致部分损坏,那就用H级的高纠错。如果是电子屏幕上显示,用L级就够了,这样二维码不会太密集。
测试很重要。生成二维码后一定要用不同的手机、不同的扫码软件测试一下。有些扫码软件对二维码的识别能力不同,特别是边缘模糊或者对比度不够的时候。最好在弱光环境、强光环境都测试一下。
如果是用在印刷品上,要注意二维码周围留出足够的空白区域。二维码的边框(quiet zone)是必须的,扫码设备靠这个来定位二维码。如果周围有其他图案太近,可能会干扰识别。
还有个细节是DPI设置。如果二维码要打印,生成图片时要设置合适的DPI,否则打印出来可能尺寸不对。一般印刷用300DPI,普通打印用150-200DPI就行。
对于需要生成大量二维码的场景,可以考虑把生成逻辑封装成函数,加上缓存机制。同样的内容不需要重复生成,直接从缓存读取图片就行,能提高性能。
和同类技术对比
Python里生成二维码的库不止qrcode一个,还有像pyqrcode、segno这些。每个库都有自己的特点。
pyqrcode的一个优势是能生成SVG矢量图。矢量图放大不会失真,适合需要印刷的场景。而且pyqrcode不依赖Pillow,如果环境里不方便装Pillow,可以考虑用这个库。不过它的API设计没有qrcode那么直观。
segno这个库比较新,支持的功能更多一些。比如能生成动态二维码、能生成艺术二维码(在二维码里嵌入logo或者图案)。但相应的,它的API也更复杂一些,学习成本高一点。
qrcode最大的优势就是简单。API设计得很直观,几行代码就能用起来。文档也清晰,常见需求都能满足。而且因为出现得早,社区活跃,遇到的问题基本都能找到解决方案。
如果只是需要生成普通的二维码,qrcode完全够用。如果需要更高级的功能,比如生成带logo的二维码,qrcode配合Pillow也能实现,就是需要自己写点代码来处理图片叠加。
性能方面,这几个库都差不多。生成一个普通二维码都是毫秒级的,除非是生成大量二维码或者特别复杂的二维码,否则不用担心性能问题。
选择哪个库,主要还是看具体需求。如果项目已经用了Pillow,那用qrcode很自然。如果需要生成矢量图,那就选pyqrcode。如果要最新最全的功能,可以试试segno。
不过话说回来,二维码生成这种功能,稳定可靠比功能多更重要。毕竟生成出来扫不出来就尴尬了。从这点来说,qrcode经过这么多年的使用,可靠性是有保证的。
最后提一句,二维码虽然方便,但也要注意安全。不要随便扫来历不明的二维码,生成二维码时也要注意不要包含敏感信息。特别是用在公开场合的二维码,生成前最好检查一下内容。