能否使用Python生成自定义点形状的QR码?
Python生成圆点样式自定义QR码实现方案
完全可以实现,以下是两种可直接落地的实现路径,生成效果可完全匹配参考图的圆点QR码样式:
方案1:基于Segno库快速实现(推荐,适配成本最低)
Segno原生支持QR码模块形状自定义,不需要手动编写逐点绘制逻辑,几行代码即可生成可正常识别的圆点QR码:
- 先安装所需依赖:
pip install segno pillow - 核心实现代码:
import segno # 初始化QR码对象,纠错等级选最高的H级,避免改形后识别失败 qr = segno.make("需要写入QR码的文本/链接内容", error='H') # 导出圆点样式QR码 qr.to_pil( scale=10, # 整体缩放比例,数值越大导出图片分辨率越高 dark='#000000', # 码点颜色 light='#ffffff', # 背景色 finder_dark='#000000', # 三角定位块颜色 module_drawer='circle', # 核心配置:将默认方形码点替换为圆形 border=2 # 二维码四周留白边距 ).save("circle_style_qr.png")
该方案生成的圆点码点间隙均匀,三个角的定位块会自动保留标准QR码识别结构,不会因为码点改形出现扫码失败的问题。如果需要其他点形(菱形、圆角方形等),只需修改
module_drawer对应的参数值即可。
方案2:基于qrcode+Pillow自定义绘制(适合高度定制化需求)
如果需要实现更特殊的点形效果(比如渐变圆点、自定义图标码点),可以通过基础QR码库获取码点二维矩阵,手动控制每个位置的绘制逻辑:
- 安装依赖:
pip install qrcode pillow - 核心实现代码:
import qrcode from PIL import Image, ImageDraw # 生成QR码基础矩阵 qr = qrcode.QRCode( version=None, error_correction=qrcode.constants.ERROR_CORRECT_H, box_size=10, border=2, ) qr.add_data("需要写入QR码的文本/链接内容") qr.make(fit=True) code_matrix = qr.get_matrix() box_size = qr.box_size border_width = qr.border img_size = (len(code_matrix) + border_width * 2) * box_size # 创建空白画布 qr_img = Image.new("RGB", (img_size, img_size), "white") draw = ImageDraw.Draw(qr_img) # 遍历所有码点位置逐点绘制 for row_idx in range(len(code_matrix)): for col_idx in range(len(code_matrix)): # 定位三个角的定位块区域,保留标准方形结构保证识别率 is_finder_area = (row_idx < 7 and col_idx <7) or \ (row_idx <7 and col_idx > len(code_matrix)-8) or \ (row_idx > len(code_matrix)-8 and col_idx <7) if is_finder_area: if code_matrix[row_idx][col_idx]: x0 = (col_idx + border_width) * box_size y0 = (row_idx + border_width) * box_size draw.rectangle([x0, y0, x0+box_size, y0+box_size], fill="black") continue # 普通码点位置绘制圆形 if code_matrix[row_idx][col_idx]: center_x = (col_idx + border_width)*box_size + box_size//2 center_y = (row_idx + border_width)*box_size + box_size//2 radius = box_size//2 - 1 # 留1px间隙避免相邻圆点粘连 draw.ellipse( [center_x-radius, center_y-radius, center_x+radius, center_y+radius], fill="black" ) qr_img.save("custom_circle_qr.png")
实现注意事项
- 无论用哪种方案,都建议把QR码纠错等级开到最高(H级,可容忍30%左右的码面遮挡/形变),大幅降低改形后的识别失败概率
- 三个角的定位块不要改成圆形,必须保留标准的方形嵌套结构,否则大部分扫码设备无法正常识别
- 如果需要叠加logo、做渐变彩色效果,直接在生成的PIL图像对象上做二次绘制即可,逻辑和普通图片处理完全一致
参考效果如下:
内容的提问来源于stack exchange,提问作者Mahfujul Hasan
相关产品推荐
相关产品推荐

