如何使用Python(pylibdmxt)生成指定大小的DataMatrix二维码PNG文件
解决方案
你生成的原始DataMatrix每个数据单元仅占1像素,要设置指定输出尺寸,可通过等比例放大二维码单元的方式实现,避免二维码变形降低识别率,修改后代码如下:
from PIL import Image, ImageOps # datamatrix编码依赖,如果你使用其他编码库可自行替换 from pylibdmtx.pylibdmtx import encode def createDatamatrix(self): data = 'SN: 1665464'+'\nTN: H76vdg/'+'\nConfigs:Sample' self.encoded_data = encode(data.encode('utf-8')) # 生成原生尺寸二维码 raw_img = Image.frombytes('RGB', (self.encoded_data.width, self.encoded_data.height), self.encoded_data.pixels) # 自定义目标输出像素尺寸,此处示例为400*400,可根据需求修改 target_size = 400 # 计算整数缩放倍数,保证每个二维码数据单元为正方形,无变形 scale = target_size // raw_img.width # 用最近邻插值放大,保证边缘锐利无模糊 self.img = raw_img.resize( (raw_img.width * scale, raw_img.height * scale), # 如果你使用的Pillow版本低于9.1.0,请将下方参数替换为Image.NEAREST resample=Image.Resampling.NEAREST ) # 若需要严格匹配target_size尺寸,可取消下方注释补白边 # pad_width = (target_size - self.img.width) // 2 # pad_height = (target_size - self.img.height) // 2 # self.img = ImageOps.expand(self.img, border=(pad_width, pad_height, pad_width, pad_height), fill='white') self.img.save('test.png')
注意事项
- 必须使用*最近邻插值(NEAREST)*进行缩放,不能用默认的线性插值,否则二维码会出现模糊边缘,大幅降低识别成功率
- 缩放倍数取整数是为了保证每个二维码数据单元的像素大小一致,无变形。如果接受轻微变形,也可以直接把目标尺寸传入resize方法,仅保留resample参数即可
内容的提问来源于stack exchange,提问作者wimsen
相关产品推荐
相关产品推荐

