104 lines
4.1 KiB
Python
104 lines
4.1 KiB
Python
#!/usr/bin/env python
|
||
"""Command‑line 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()
|