#!/usr/bin/env python3
"""
命令行二维码生成器
支持文本、URL、WIFI配置等多种内容生成二维码
"""
import qrcode
import argparse
import sys
from pathlib import Path
from qrcode.image.styledpil import StyledPilImage
from qrcode.image.styles.moduledrawers import RoundedModuleDrawer
def generate_qrcode(data, output_path, size=10, border=4,
fill_color="black", back_color="white",
rounded_corners=False, logo_path=None):
"""
生成二维码
Args:
data: 要编码的数据
output_path: 输出文件路径
size: 二维码尺寸(每个模块的像素数)
border: 边框大小(模块数)
fill_color: 前景色
back_color: 背景色
rounded_corners: 是否使用圆角模块
logo_path: Logo图片路径(可选)
"""
try:
# 创建QRCode实例
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_H,
box_size=size,
border=border,
)
# 添加数据
qr.add_data(data)
qr.make(fit=True)
# 创建图片
if rounded_corners:
img = qr.make_image(
fill_color=fill_color,
back_color=back_color,
image_factory=StyledPilImage,
module_drawer=RoundedModuleDrawer()
)
else:
img = qr.make_image(
fill_color=fill_color,
back_color=back_color
)
# 添加Logo(如果提供)
if logo_path and Path(logo_path).exists():
from PIL import Image
logo = Image.open(logo_path)
# 计算Logo尺寸(二维码的1/4)
qr_width, qr_height = img.size
logo_size = min(qr_width, qr_height) // 4
# 调整Logo大小
logo = logo.resize((logo_size, logo_size), Image.Resampling.LANCZOS)
# 计算Logo位置(居中)
pos = ((qr_width - logo_size) // 2, (qr_height - logo_size) // 2)
# 粘贴Logo
img.paste(logo, pos)
# 保存图片
img.save(output_path)
print(f"二维码已生成: {output_path}")
except Exception as e:
print(f"生成二维码时出错: {e}", file=sys.stderr)
sys.exit(1)
def main():
parser = argparse.ArgumentParser(
description="命令行二维码生成器",
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog="""
示例:
%(prog)s "Hello World" -o qr.png
%(prog)s "https://example.com" -o qr.png --size 15 --rounded
%(prog)s "WIFI:S:MyNetwork;T:WPA;P:MyPassword;;" -o wifi_qr.png
%(prog)s "BEGIN:VCARD\\nVERSION:3.0\\nFN:John Doe\\nEND:VCARD" -o contact.png
"""
)
# 必需参数
parser.add_argument("data", help="要编码的数据(文本、URL等)")
parser.add_argument("-o", "--output", required=True,
help="输出文件路径(支持.png, .jpg, .bmp等格式)")
# 可选参数
parser.add_argument("--size", type=int, default=10,
help="二维码尺寸(默认: 10)")
parser.add_argument("--border", type=int, default=4,
help="边框大小(默认: 4)")
parser.add_argument("--fill-color", default="black",
help="前景色(默认: black)")
parser.add_argument("--back-color", default="white",
help="背景色(默认: white)")
parser.add_argument("--rounded", action="store_true",
help="使用圆角模块")
parser.add_argument("--logo", help="Logo图片路径(可选)")
args = parser.parse_args()
# 生成二维码
generate_qrcode(
data=args.data,
output_path=args.output,
size=args.size,
border=args.border,
fill_color=args.fill_color,
back_color=args.back_color,
rounded_corners=args.rounded,
logo_path=args.logo
)
if __name__ == "__main__":
main()
安装依赖:
pip install qrcode[pil] pillow
使用方法:
- 保存为
qrgen.py
- 添加执行权限:
chmod +x qrgen.py
- 基本使用:
./qrgen.py "你的内容" -o output.png
- 高级选项:
./qrgen.py "https://example.com" -o qr.png --size 15 --rounded --logo logo.png
功能特点:
- 支持文本、URL、WIFI配置、vCard等多种格式
- 可自定义尺寸、颜色、边框
- 支持圆角模块样式
- 可添加Logo水印
- 错误纠正级别高(ERROR_CORRECT_H)
使用示例:
# 生成普通文本二维码
./qrgen.py "Hello, World!" -o hello.png
# 生成带圆角的URL二维码
./qrgen.py "https://github.com" -o github.png --rounded --size 12
# 生成WIFI配置二维码(手机可直接扫码连接)
./qrgen.py "WIFI:S:MyNetwork;T:WPA2;P:MyPassword;;" -o wifi.png
# 生成带Logo的二维码
./qrgen.py "https://example.com" -o with_logo.png --logo company_logo.png
这个工具用argparse处理命令行参数,qrcode库生成二维码,PIL处理图像。核心是generate_qrcode()函数,它处理所有生成逻辑。错误纠正设为H级别,能修复30%的数据损坏。
总结:用qrcode库加argparse就能快速搞定。