qr_ascii/main.py
2025-07-21 15:35:35 +08:00

104 lines
4.1 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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