qr_ascii/main.py

104 lines
4.1 KiB
Python
Raw Normal View History

2025-07-21 07:35:35 +00:00
#!/usr/bin/env python
"""Commandline interface for QR-ASCII-QR."""
import argparse
import os
from qr_ascii_qr import generate_matrix, render_to_png, render_to_svg
def main():
parser = argparse.ArgumentParser(description="Generate an ASCII-character QR code.")
parser.add_argument("-d", "--data", required=True, help="Data to encode")
parser.add_argument("-o", "--out", required=True, help="Output file prefix (.png or .svg)")
parser.add_argument("-s", "--cell-size", type=int, default=20, help="Pixel size of each cell (PNG only)")
parser.add_argument("-c", "--charset", default="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ", help="Characters to use")
parser.add_argument("-e", "--ec-level", default="H", choices=list("LMQH"), help="Error correction level")
parser.add_argument("--font", help="TrueType font path (PNG only)")
parser.add_argument("--logo", help="Logo image path (PNG only)")
parser.add_argument("--svg", action="store_true", help="Force SVG output")
parser.add_argument("--three-types", action="store_true", help="Generate three types of QR codes")
parser.add_argument("--text-only", action="store_true", help="Generate only text QR code")
args = parser.parse_args()
matrix = generate_matrix(args.data, args.ec_level)
if args.text_only:
# 只生成纯文字二维码
ext = args.out.lower().split(".")[-1]
if args.svg or ext == "svg":
render_to_svg(matrix, args.out, cell_size=args.cell_size, charset=args.charset)
else:
render_to_png(
matrix,
args.out,
cell_size=args.cell_size,
charset=args.charset,
font_path=args.font,
logo_path=args.logo,
render_mode="text"
)
print(f"已保存纯文字二维码: {args.out}")
elif args.three_types:
# 生成三种类型的图片
base_name, ext = os.path.splitext(args.out)
if args.svg or ext.lower() == ".svg":
# SVG模式
render_to_svg(matrix, f"{base_name}_combined{ext}", cell_size=args.cell_size, charset=args.charset)
print(f"Saved {base_name}_combined{ext}")
else:
# PNG模式 - 生成三张图片
# 1. 纯黑块二维码
solid_file = f"{base_name}_solid{ext}"
render_to_png(
matrix,
solid_file,
cell_size=args.cell_size,
charset=args.charset,
font_path=args.font,
logo_path=args.logo,
render_mode="solid"
)
print(f"已保存纯黑块二维码: {solid_file}")
# 2. 纯文字二维码
text_file = f"{base_name}_text{ext}"
render_to_png(
matrix,
text_file,
cell_size=args.cell_size,
charset=args.charset,
font_path=args.font,
logo_path=args.logo,
render_mode="text"
)
print(f"已保存纯文字二维码: {text_file}")
# 3. 结合二维码(黑色背景+文字)
combined_file = f"{base_name}_combined{ext}"
render_to_png(
matrix,
combined_file,
cell_size=args.cell_size,
charset=args.charset,
font_path=args.font,
logo_path=args.logo,
render_mode="combined"
)
print(f"已保存结合二维码: {combined_file}")
else:
# 原有的单个文件生成逻辑
ext = args.out.lower().split(".")[-1]
if args.svg or ext == "svg":
render_to_svg(matrix, args.out, cell_size=args.cell_size, charset=args.charset)
else:
render_to_png(
matrix,
args.out,
cell_size=args.cell_size,
charset=args.charset,
font_path=args.font,
logo_path=args.logo,
)
print(f"Saved {args.out}")
if __name__ == "__main__":
main()