Python中如何实现命令行生成二维码的软件

源码:https://github.com/RitterHou/Lilith 欢迎 star,欢迎 fork~~

安装:

pip install lilith

使用:

lilith v2ex.com

详细的操作过程可以参考 demo


Python中如何实现命令行生成二维码的软件

18 回复

实验了一下,有趣


#!/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

使用方法:

  1. 保存为 qrgen.py
  2. 添加执行权限:chmod +x qrgen.py
  3. 基本使用:./qrgen.py "你的内容" -o output.png
  4. 高级选项:./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就能快速搞定。

建议增加一些参数,比如直接写入到文件、显示大小等

qrencode

学习了 谢谢楼主分享 ~~~

扫描识别不了

这是什么终端好漂亮

#5 怎么会识别不了呢?

要不使用 lilith http://www.v2ex.com 试试看?
是不是因为没有加 http 啊?

#2 之前也想着加上的,后来偷懒就一直没加,后面看有时间就把加上去吧

PS: 如果你有兴趣实现一些功能的话也欢迎提 pr~~

qrcode +1

不是已经有了一个甚至能生成 gif 的轮子了吗?

参观学习一下

https://github.com/7sDream/pyqart

纯 Python 实现的二维码编码器,除了导出图片那一步用到了 pillow,其它没有用任何三方库,直接看 ISO 标准撸的。

性能可能略慢,没优化,不过想研究二维码生成机制,相关标准的可以看看。

附带了几种常用的图片修饰策略。

(不过这项目的代码我自己已经看不懂了 Orz

莉莉丝…那我写个 eva,专门识别二维码

zsh 啊,软件是 iterm2

#12 哇,膜拜大佬~~

这个好玩

回到顶部