当前位置: 首页 > news >正文

用 Python 生成功能强大的二维码工具(支持自定义颜色与 Logo)

在很多项目中,二维码作为一种便捷的方式传递信息越来越常见。今天,我们将介绍如何用 Python 编写一个功能更全的二维码生成工具,它不仅支持自定义二维码的颜色,还能在二维码中间添加 logo。

1. 环境准备

首先,我们需要安装 qrcodePillow 库,这两个库分别负责生成二维码和处理图像。你可以通过以下命令来安装这两个库:

pip install qrcode[pil]
pip install Pillow
2. 编写二维码生成工具

我们将在下面的代码中展示如何生成二维码。此工具不仅支持基本的二维码生成,还包括了以下功能:

  • 自定义二维码的颜色(前景色和背景色)。
  • 可以在二维码中间嵌入一个 logo 图标。
  • 支持设置二维码的尺寸和错误纠正级别。
    import qrcode
    from PIL import Imagedef generate_qr_code(data, logo_path=None, output_file="qrcode.png", version=1, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=10, border=4, fg_color="black", bg_color="white"):# 创建二维码对象qr = qrcode.QRCode(version=version,  # 控制二维码的大小error_correction=error_correction,  # 错误纠正级别box_size=box_size,  # 每个“格子”的像素大小border=border,  # 边框宽度)# 将数据添加到二维码对象中qr.add_data(data)qr.make(fit=True)# 创建二维码的图像img = qr.make_image(fill=fg_color, back_color=bg_color)# 如果有 logo,合并 logo 到二维码中间if logo_path:try:logo = Image.open(logo_path)# 调整 logo 大小为二维码图像的 1/5logo_size = min(img.size) // 5logo = logo.resize((logo_size, logo_size))# 计算 logo 放置的位置logo_position = ((img.size[0] - logo.size[0]) // 2, (img.size[1] - logo.size[1]) // 2)img.paste(logo, logo_position, logo.convert("RGBA"))  # 如果 logo 有透明背景,保留透明度except Exception as e:print(f"Error loading logo: {e}")# 保存二维码图像img.save(output_file)print(f"二维码已生成并保存为 {output_file}")# 示例使用
    if __name__ == "__main__":data = "https://www.example.com"logo_path = "logo.png"  # 如果你不需要 logo,可以设置为 Nonegenerate_qr_code(data=data,logo_path=logo_path,  # 如果不想使用 logo,设置为 Noneoutput_file="custom_qrcode.png",version=5,error_correction=qrcode.constants.ERROR_CORRECT_H,  # 更高的纠错级别box_size=12,border=6,fg_color="blue",  # 设置前景色为蓝色bg_color="yellow"  # 设置背景色为黄色)
    
    3. 代码解释
    3.1 创建二维码对象
  • qr = qrcode.QRCode(version=1,  # 控制二维码的大小error_correction=qrcode.constants.ERROR_CORRECT_L,  # 错误纠正级别box_size=10,  # 每个“格子”的像素大小border=4,  # 边框宽度
    )
    

    QRCode 类用于创建一个二维码对象。其主要参数包括:

  • version:控制二维码的大小,1 是最小的,最高可以达到 40。
  • error_correction:二维码的错误纠正级别,决定二维码在损坏的情况下能恢复多少数据。ERROR_CORRECT_L 表示 7% 的错误可以恢复,其他级别包括 ERROR_CORRECT_M(15%)、ERROR_CORRECT_Q(25%)和 ERROR_CORRECT_H(30%)。
  • box_size:设置每个“盒子”的像素大小。
  • border:设置二维码的边框宽度,最小值为 4。
  • 3.2 添加数据并生成二维码图像
    qr.add_data(data)
    qr.make(fit=True)
    img = qr.make_image(fill=fg_color, back_color=bg_color)
    

  • qr.add_data(data):添加需要编码的数据(例如 URL 或文本)。
  • qr.make(fit=True):根据数据自动调整二维码的大小。
  • qr.make_image():生成二维码图像,可以通过 fillback_color 参数自定义前景色和背景色。
3.3 添加 Logo

如果传入了 logo 文件路径,程序会将 logo 添加到二维码的中央,并自动调整 logo 的大小以适应二维码。

if logo_path:logo = Image.open(logo_path)logo = logo.resize((logo_size, logo_size))  # 调整 logo 大小logo_position = ((img.size[0] - logo.size[0]) // 2, (img.size[1] - logo.size[1]) // 2)img.paste(logo, logo_position, logo.convert("RGBA"))  # 保持透明度

3.4 保存二维码

img.save(output_file)

最终,二维码图像会被保存为指定路径的 PNG 文件。

4. 功能说明
  • 数据(data):需要编码的数据,例如 URL 或文本内容。
  • Logo(logo_path):二维码中间嵌入的 logo 图像(可选)。如果不需要 logo,可以将 logo_path 设置为 None
  • 二维码文件输出(output_file):二维码生成后保存的文件路径。
  • 二维码尺寸(version):调整二维码的大小,最大支持 version=40
  • 错误纠正级别(error_correction):提供四个级别的错误纠正:ERROR_CORRECT_L(最低纠正)、ERROR_CORRECT_MERROR_CORRECT_QERROR_CORRECT_H(最高纠正)。
  • 格子大小(box_size):每个“格子”的像素大小,调整二维码的细节。
  • 边框宽度(border):二维码的边框宽度,最小为 4。
  • 前景色(fg_color)和背景色(bg_color):自定义二维码的颜色。
5. 总结

本文介绍了如何使用 Python 和 qrcode 库生成功能丰富的二维码工具。你可以自定义二维码的颜色、大小、错误纠正级别,还可以在二维码中嵌入 logo。这个工具适合生成各种个性化的二维码,满足你不同场景的需求。

  结尾:样例小程序二维码,自己做的一个免费好用的排班小程序

相关文章:

用 Python 生成功能强大的二维码工具(支持自定义颜色与 Logo)

在很多项目中,二维码作为一种便捷的方式传递信息越来越常见。今天,我们将介绍如何用 Python 编写一个功能更全的二维码生成工具,它不仅支持自定义二维码的颜色,还能在二维码中间添加 logo。 1. 环境准备 首先,我们需…...

RTX5 数据队列传输流程

1、首先获取当前内存是否有值 rptr = (net_mpool_t*)osMemoryPoolAlloc(id_mp_net,0U); 说明:通过相同的key,可以操作值。 2、设值到队列中 如果有值,则将rptr变量的值放入消息队列id_mp_net rptr->len = USART2_RxBfr[0]+1;memcpy (rptr->Recvbuf, &USART2_Rx…...

24.try块怎么用 C#例子

这是一个用英语写的try-catch例子 简单来说就是一个try,try里面的代码可能会出错,然后有两个catch,规定了具体的错误是什么 如果发生相应的错误,就会把错误信息存到err里,err.Message是一个字符串格式的提示信息&…...

【机器学习 | 数据挖掘】智能推荐算法

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈智能大数据分析 ⌋ ⌋ ⌋ 智能大数据分析是指利用先进的技术和算法对大规模数据进行深入分析和挖掘,以提取有价值的信息和洞察。它结合了大数据技术、人工智能(AI)、机器学习(ML&a…...

120.【C语言】数据结构之快速排序(详解Hoare排序算法)

目录 1.Hoare单趟排序思想 2.单趟排序代码 初次写的代码 运行结果 查找问题原因 尝试解决问题 初次修正后代码 运行结果 正确的单趟排序代码 3.将单趟排序嵌入 如何递归? 递归结束的条件 1.较容易分析的结束条件:leftright 2.以{2,1}为例分析另一个结束条件 完整…...

uniapp通过v-if进行判断时,会出现闪屏?【已解决】

1.问题:按钮切换时,通过v-if来判断,会出现闪烁情况,影响用户体验 2.v-if 闪烁问题可能的原因 ‌条件切换频繁‌:如果 v-if 指令的条件在短时间内频繁切换,会导致元素不断被销毁和重新创建,从而…...

各种网站(学习资源、常用工具及其他,持续更新中~)

欢迎围观笔者的个人博客~ 也欢迎通过RSS网址https://kangaroogao.github.io/atom.xml进行订阅~ 大学指南 上海交通大学生存手册中国科学技术大学人工智能与数据科学学院本科进阶指南USTC不完全入学指南大学生活质量指北科研论 信息搜集 AI信息搜集USTC飞跃网站计算机保研 技…...

网络技术-QoS策略以及如何定义 流分类,流行为,流策略

一:QoS策略简介 QoS策略由如下部分组成: 类,定义了对报文进行识别的规则。 流行为,定义了一组针对类识别后的报文所做的QoS动作。 通过将类和流行为关联起来,QoS策略可对符合分类规则的报文执行流行为中定义的…...

线程晨考day20

1.线程的五种状态 创建 就绪 运行 阻塞 死亡 2.创建线程的两种方式 继承Thread类 重写run方法 实现Runnable接口 重写run方法 3.调用start和调用run方法的区别 调用start方法表示会开启新的线程 run方法不会开启新的线程 4.线程调度常用的方法 sleep() join() yield() 5.进程和…...

【ES6复习笔记】迭代器(10)

什么是迭代器? 迭代器(Iterator)是一种对象,它能够遍历并访问一个集合中的元素。在 JavaScript 中,迭代器提供了一种统一的方式来处理各种集合,如数组、字符串、Map、Set 等。通过迭代器,我们可…...

MySQL的TIMESTAMP类型字段非空和默认值属性的影响

同事说他通过某款商业数据同步软件将一个 MySQL 5.7.28 的库同步到 MySQL 5.7.20 的库时,如果表中含有 TIMESTAMP 数据类型、缺省值为 current_timestamp 的字段,这些表的同步任务就都失败了,而另外的一些包含了 DATETIME 数据类型的表就同步…...

【Linux进程】初悉进程

学习编程就得循环渐进,扎实基础,勿在浮沙筑高台 循环渐进Forward-CSDN博客 进程调度简介 1.2进程查看命令 1.3进程的几个要素 二、进程的生命周期 2.1进程状态文字描述 2.2进程状态的切换 2.3task_struct数据结构 2.4进程优先级 ⑴优先级的代…...

Python学习之路(5)— 使用C扩展

Python学习之路(5)— 使用C扩展 一、前言 参考:https://www.cnblogs.com/yinguo/p/4641349.html Python C扩展是指用C语言编写的代码,然后编译成Python可以调用的库。这样可以提高Python代码的执行效率,或者实现某些…...

动态规划34:446. 等差数列划分 II - 子序列

动态规划解题步骤: 1.确定状态表示:dp[i]是什么 2.确定状态转移方程:dp[i]等于什么 3.初始化:确保状态转移方程不越界 4.确定填表顺序:根据状态转移方程即可确定填表顺序 5.确定返回值 题目链接:446.…...

PPT画图——如何设置导致图片为600dpi

winr,输入regedit打开注册表 按路径找,HKEY_CURRENT_USER\Software\Microsoft\Office\XX.0\PowerPoint\Options(xx为版本号,16.0 or 15.0或则其他)。名称命名:ExportBitmapResolution 保存即可,…...

【模块系列】STM321.69TFT屏幕

前言 在翻翻自己的器件盒的时候,发现这块好久之前买的TFT屏了,想起还没有用STM32点亮过,手头上正好有立创的梁山派STM32F4,就试着按照网上的文章教程顺便移植个LVGL看看,然后就有了就本文。 代码工程命名的是LvglDemo&…...

大模型辅助测试的正确打开方式?

测试的基本目的之一,是对被测对象进行质量评估。换言之,是要提供关于被测对象质量的“确定性”。因此,我们很忌讳在测试设计中引入“不确定性”,比如采用不可靠的测试工具、自动化测试代码逻辑复杂易错、测试选择假设过于主观等等…...

三相电的相电压、线电压、额定值、有效值,变比,零序电压,零序电流,三相三线制的三角形连接,三相四线制的星形连接

在二次设备配置中经常有根电压系统相关的名词,本身不是学电气的,有些名词经常查了忘,后续工作所有遇到跟电气相关的知识总结在此帖,便于后续直接查看,避免每次都要重新查、重新梳理。 相电压和线电压的关系是根号3倍&a…...

电商网站的基础用户数在100万,日活跃用户数在1万左右,系统下单TPS最大支持1000,应用服务要保证高可用。请预估该网站每天的使用成本。

要预估一个电商网站每天的使用成本,我们需要考虑多个因素,包括计算资源、数据库、缓存、存储、网络流量、负载均衡、安全服务、监控与日志等。以下是基于您提供的信息(基础用户数100万,日活跃用户数1万,系统下单TPS最大…...

线性代数期末总复习的点点滴滴(1)

一、可逆矩阵、行列式、秩的关系 1.行列式与可逆矩阵的关系 所以,不难看出矩阵可逆的充分必要条件是该矩阵的行列式不为0。 2.接着来看,满秩和矩阵行列式的关系 不难看出满秩和行列式不为0是等价的。 3.再来看,满秩和矩阵可逆的关系 说明了…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...

第八部分:阶段项目 6:构建 React 前端应用

现在,是时候将你学到的 React 基础知识付诸实践,构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段,你可以先使用模拟数据,或者如果你的后端 API(阶段项目 5)已经搭建好,可以直接连…...

AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)

Name:3ddown Serial:FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名:Axure 序列号:8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...

C++11 constexpr和字面类型:从入门到精通

文章目录 引言一、constexpr的基本概念与使用1.1 constexpr的定义与作用1.2 constexpr变量1.3 constexpr函数1.4 constexpr在类构造函数中的应用1.5 constexpr的优势 二、字面类型的基本概念与使用2.1 字面类型的定义与作用2.2 字面类型的应用场景2.2.1 常量定义2.2.2 模板参数…...