使用python-barcode与PIL生成3.8×2cm清晰可扫描条码贴纸问题
解决条码缩放后像素化的问题
核心原因
你遇到的像素化问题,本质是python-barcode默认生成的是低分辨率位图,后续用PIL缩放属于拉伸低像素图像,插值算法(包括LANCZOS)只能优化边缘,没法凭空生成高清细节,自然无法满足打印扫描的清晰度要求。
两种可行解决方案
方案1:生成矢量条码(SVG)再转高分辨率位图
矢量图可以无限缩放不失真,先生成SVG格式的条码,再转成对应尺寸的高分辨率PNG:
import barcode from barcode.writer import SVGWriter import cairosvg # 生成SVG格式条码 barcode_type = 'code128' # 根据需求更换条码类型 barcode_data = '1234567890' # 你的条码内容 code = barcode.get(barcode_type, barcode_data, writer=SVGWriter()) svg_file = code.save('temp_barcode') # 按3.8×2cm、300DPI转成PNG(打印标准分辨率) # 3.8cm ≈ 449像素,2cm ≈ 236像素(计算方式:厘米数/2.54*300) cairosvg.svg2png( url=svg_file, write_to='final_barcode.png', output_width=449, output_height=236, dpi=300 )
注:需要先安装依赖pip install cairosvg python-barcode
方案2:直接生成高分辨率位图
提前计算300DPI下3.8×2cm对应的像素参数,在生成条码时直接设置足够的尺寸,避免后续缩放:
import barcode from barcode.writer import ImageWriter # 打印用300DPI,计算对应参数 # module_width:条码最细条的宽度(单位cm),保证在300DPI下至少2像素 # module_height:条码高度直接设为2cm options = { 'module_width': 0.02, # 0.02cm≈0.2mm,对应300DPI下约2.4像素 'module_height': 2.0, # 条码高度2cm 'dpi': 300, # 生成时的分辨率 'text_distance': 6, # 条码文字与条码的间距(像素) 'font_size': 10, # 条码文字大小 } barcode_type = 'code128' barcode_data = '1234567890' code = barcode.get(barcode_type, barcode_data, writer=ImageWriter()) # 生成的图片直接符合尺寸要求,无需后续缩放 code.save('final_barcode', options=options)
额外提示
- 打印条码的标准分辨率是300DPI,低于这个值容易出现扫描不清晰的问题。
- 如果必须用PIL调整尺寸,前提是原始图的分辨率至少是目标尺寸的2倍以上,再用LANCZOS缩小,能一定程度提升清晰度,但效果不如上述两种方案。
内容的提问来源于stack exchange,提问作者Hamoda Elemary
相关产品推荐
相关产品推荐

