1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
|
""" 把0/1矩阵转成二维码样式图片: - 1 = 黑色 - 0 = 白色 - 自动在左上、左下、右上添加 Finder Pattern """
import argparse from PIL import Image, ImageOps
def read_matrix_from_file(path): with open(path, "r", encoding="utf-8") as f: lines = [line.strip().replace(" ", "") for line in f if line.strip()] if not lines: raise ValueError("输入文件为空!") width = len(lines[0]) for i, row in enumerate(lines, 1): if len(row) != width: raise ValueError(f"第 {i} 行长度 {len(row)} 与首行 {width} 不一致") if any(c not in "01" for c in row): raise ValueError(f"第 {i} 行含有非法字符:{row}") return [[c == "1" for c in row] for row in lines]
def add_finder_patterns(matrix): """在左上、左下、右上加上7x7的finder pattern""" rows, cols = len(matrix), len(matrix[0])
def put_finder(r0, c0): for r in range(7): for c in range(7): rr, cc = r0 + r, c0 + c if rr >= rows or cc >= cols: continue if ( r in [0, 6] or c in [0, 6] or (2 <= r <= 4 and 2 <= c <= 4) ): matrix[rr][cc] = True else: matrix[rr][cc] = False
put_finder(0, 0) put_finder(rows - 7, 0) put_finder(0, cols - 7) return matrix
def matrix_to_image(matrix, scale=10, margin=4): rows, cols = len(matrix), len(matrix[0]) flat_bits = [] for row in matrix: for v in row: flat_bits.append(0 if v else 1)
base = Image.new("1", (cols, rows)) base.putdata(flat_bits) img = base.resize((cols * scale, rows * scale), resample=Image.NEAREST)
if margin > 0: border_px = margin * scale img = ImageOps.expand(img, border=border_px, fill=1)
return img.convert("L")
def main(): parser = argparse.ArgumentParser(description="0/1矩阵转二维码样式PNG") parser.add_argument("-i", "--input", required=True, help="输入矩阵文件(文本,包含0和1)") parser.add_argument("-o", "--output", default="qr.png", help="输出PNG文件名") parser.add_argument("--scale", type=int, default=10, help="每个模块像素大小") parser.add_argument("--margin", type=int, default=4, help="外边距模块数") args = parser.parse_args()
matrix = read_matrix_from_file(args.input) matrix = add_finder_patterns(matrix) img = matrix_to_image(matrix, scale=args.scale, margin=args.margin) img.save(args.output) print(f"✅ 已生成二维码样式图:{args.output}")
if __name__ == "__main__": main()
|