如何将qrcode库生成的黑白二维码转换为0和1组成的字符串?
如何从qrcode生成的二维码导出0/1字符串(黑=1,白=0)
有两种高效的实现方式,优先推荐直接操作二维码的原始模块数据,避免图片处理的额外步骤:
方法1:直接使用QRCode对象的modules属性(推荐)
qrcode库生成二维码后,QRCode实例的modules属性存储了原始的二维码模块矩阵——每个元素为True(对应黑色像素)或False(对应白色像素),直接遍历这个矩阵转换即可:
import qrcode qr = qrcode.QRCode( version=1, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=10, border=4, ) data = "hello world!" qr.add_data(data) qr.make(fit=True) # 遍历二维码模块矩阵,转换为0/1字符串 binary_str = "" for row in qr.modules: # 将每行的True转"1",False转"0",拼接成单行字符串 line = "".join("1" if pixel else "0" for pixel in row) binary_str += line + "\n" # 输出结果或保存到文件 print(binary_str) with open("qrcode_binary.txt", "w") as f: f.write(binary_str) # 保留原有的图片生成代码 img = qr.make_image(back_color=(255, 255, 255), fill_color=(0, 0, 0)) img.save("test.png")
方法2:通过生成的Image对象处理像素
如果需要基于已生成的图片文件/Image对象处理,可以通过读取像素值判断颜色,注意要跳过边框和放大倍数的影响:
import qrcode qr = qrcode.QRCode( version=1, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=10, border=4, ) data = "hello world!" qr.add_data(data) qr.make(fit=True) img = qr.make_image(back_color=(255, 255, 255), fill_color=(0, 0, 0)) width, height = img.size box_size = qr.box_size border = qr.border module_count = qr.modules_count binary_str = "" # 遍历每个二维码模块(跳过边框区域) for y in range(border, border + module_count): line = "" for x in range(border, border + module_count): # 取每个模块左上角的像素判断颜色(因为box_size是放大倍数,模块内像素一致) pixel_x = x * box_size pixel_y = y * box_size pixel_color = img.getpixel((pixel_x, pixel_y)) line += "1" if pixel_color == (0, 0, 0) else "0" binary_str += line + "\n" print(binary_str) img.save("test.png")
说明
- 方法1无需处理图片像素,直接使用库生成的原始矩阵数据,效率更高且结果准确;
- 方法2适用于已存在的二维码图片文件,需要注意
box_size(模块放大倍数)和border(边框模块数)的参数,确保只读取有效二维码区域的像素。
内容的提问来源于stack exchange,提问作者Bo_O
相关产品推荐
相关产品推荐

