# 聊聊Python里的二维码生成二维码这东西现在随处可见付款、加好友、下载App扫一下就行。但你知道怎么用Python自己生成二维码吗今天就来聊聊qrcode这个库。他是什么qrcode是Python里一个专门用来生成二维码的库。说白点它能把一段文字、一个网址或者其他什么信息转换成那些黑白小方块组成的图案。这库挺轻量的核心功能就一个——生成二维码图片不搞什么花里胡哨的。有意思的是这个库底层其实依赖另一个叫Pillow的库来处理图片。但qrcode把生成二维码的复杂逻辑都封装好了用起来特别简单。你不需要懂二维码的编码原理也不需要知道那些纠错码怎么算调用几个函数就能搞定。他能做什么最直接的当然是生成二维码图片了。但别小看这个功能实际用起来场景还挺多的。比如给网站生成分享二维码。有些时候用户可能是在电脑上浏览你的网站但想转到手机上看这时候在页面角落放个二维码扫一下就能在手机上打开体验会好很多。再比如生成电子票务的二维码用户下单后直接生成一个二维码发过去现场扫一下就能核销。还有个挺实用的场景是生成Wi-Fi连接的二维码。现在很多路由器管理界面都能生成这种二维码手机一扫就能连上Wi-Fi不用手动输密码。用qrcode也能实现这个功能生成特定格式的字符串就行。甚至可以用来做简单的信息传递。比如把一段较长的配置信息生成二维码设备扫一下就能读取配置。这在物联网设备初始化时挺有用的。怎么使用用qrcode生成二维码简单得有点不像话。先安装库用pip就行pip install qrcode[pil]。后面那个[pil]是为了确保把图片处理的依赖也装上。最基本的用法就三行代码importqrcode imgqrcode.make(https://www.example.com)img.save(qrcode.png)这样就在当前目录生成了一个包含网址的二维码图片。如果想控制更多参数比如二维码大小、纠错级别可以用QRCode类importqrcode qrqrcode.QRCode(version1,error_correctionqrcode.constants.ERROR_CORRECT_L,box_size10,border4,)qr.add_data(https://www.example.com)qr.make(fitTrue)imgqr.make_image(fill_colorblack,back_colorwhite)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经过这么多年的使用可靠性是有保证的。最后提一句二维码虽然方便但也要注意安全。不要随便扫来历不明的二维码生成二维码时也要注意不要包含敏感信息。特别是用在公开场合的二维码生成前最好检查一下内容。