听风起的乐天派 发表于 2022-2-22 14:19

基于MYQR库的批量生成带图片背景的二维码(支持GIF)

出于兴趣自学了一点python,想着综合一下这段时间的学习,写了这段代码
而且我在写完之后才发现myqr不支持中文。有点遗憾
还有个小问题就是我打包成exe后居然对gif的背景图会报错,但是对源码运行是没有问题的,有点想不通
而且我还不会正则表达式,感觉有的地方写的稀烂,但是目前我还不会优化,而且以我现在的能力写到这个程度我感觉就还可以了。
不过程序嘛,能跑就行

图片支持png,jpg,gif
支持批量生成二维码
内容为文字或网址,在word.txt中每个一行
图片数量可少于文本数
图片以img (i).*的形式命名,即windows系统多选重命名的格式,i从1开始编号
图片放在和程序同级的目录
二维码配置项在config.ini中修改
暂不支持中文
只有一张图片也要编号为img (1),括号是英文半角括号,img后面有个空格原理是通过读取word.txt中的每一行文本获得二维码内容,
读取config.ini中的配置获得二维码格式
在py文件的同级目录下放置要作为二维码背景的图片,
最好使用方形的图片,不然比例失调了就比较难看

嗯,确实写得稀烂,下面是代码
from MyQR import myqr
import configparser
import os
import sys
global fdir #定义全局变量,当前文件所在目录
fdir=os.path.dirname(os.path.realpath(sys.argv)) #获取当前文件所在目录
fdir='/'.join(fdir.split('\\')) #防止路径被转义
#获取配置
def getconfig():
    cf=configparser.ConfigParser() #生成配置对象
    cf.read(fdir+"/config.ini",encoding='UTF-8') #拼接配置文件路径并读取
    #获取参数
    vsion=cf.getint('config','version')
    level=cf.get('config','level')
    colorized=cf.getboolean('config','colorized')
    contrast=cf.getfloat('config','contrast')
    brightness=cf.getfloat('config','brightness')
    picture=cf.getboolean('config','picture')
    return vsion,level,colorized,contrast,brightness,picture
#获取内容
def getwords():
    word=open(fdir+"/words.txt",encoding='UTF-8').read() #读取内容
    words=word.split('\n')
    return words
#获取图片地址
def getimg(i):
    img='/img ({0}).'.format(i)
    return fdir+img+'jpg',fdir+img+'png',fdir+img+'gif'
#检测图片是否存在,并获取图片个数
def checkimg():
    i=0
    k=0
    l=0
    res=True
    while res:
      i=i+1
      j,p,g=getimg(i)
      res=os.path.exists(j)
    res=True
    while res:
      k=k+1
      j,p,g=getimg(k)
      res=os.path.exists(p)
    res=True
    while res:
      l=l+1
      j,p,g=getimg(l)
      res=os.path.exists(g)
    i=i-1
    k=k-1
    l=l-1
    if i+k+l==0:
      t=True
    else:
      t=False
    return i,k,l,t
#生成字典
def getdic():
    dic={}
    imgs=[]
    words=getwords()
    i,j,k,t=checkimg()
    for m in range(1,i+1):
      i_j,i_p,i_g=getimg(m)
      imgs.append(i_j)
    for m in range(1,j+1):
      i_j,i_p,i_g=getimg(m)
      imgs.append(i_p)
    for m in range(1,k+1):
      i_j,i_p,i_g=getimg(m)
      imgs.append(i_g)
    m=0
    for word in words:
      dic=imgs
      m=m+1
      if m>=len(imgs):
            m=0
    return dic
#生成二维码
def inputqr():
    if not os.path.exists(fdir+'/saveqr'): #创建生成目录
      os.mkdir(fdir+'/saveqr')
    v,l,color,c,b,p=getconfig() #读配置
    x,y,z,t=checkimg()
    if t:
      p=False
    if not p:
      words=getwords()
      img=None
      i=0
      for word in words:
            print('{}成功\n'.format(word))
            if img[-3:]=='gif':
                i_end='gif'
            else:
                i_end='png'
            i=i+1
            myqr.run(words=word,picture=img,version=v,level=l,colorized=color,contrast=c,brightness=b,save_dir=fdir+'/saveqr',save_name='img{}.{}'.format(i,img[-3:]))
    else:
      dic=getdic()
      i=0
      for word,img in dic.items():
            print('{}-->{}\n'.format(word,img))
            if img[-3:]=='gif':
                i_end='gif'
            else:
                i_end='png'
            i=i+1
            myqr.run(words=word,picture=img,version=v,level=l,colorized=color,contrast=c,brightness=b,save_dir=fdir+'/saveqr',save_name='img{}.{}'.format(i,i_end))

#程序入口
if __name__=='__main__':
      inputqr()
      input('程序结束')

配置文件内容

version=1
#二维码大小,范围为
level=H
#二维码纠错级别,范围为{L,M,Q,H},H为最高级,默认。
colorized=True
#二维码背景颜色,默认为 False,即黑白色
contrast=1
#对比度,值越高对比度越高,默认为 1.0
brightness=1
#亮度,值越高亮度越高,默认为 1.0,值常和对比度相同
picture=True
#是否打开背景图片开关,Trut和False均首字母大写


包含配置文件的压缩包

听风起的乐天派 发表于 2022-2-22 14:22

压缩包链接好像没打上,https://wwm.lanzouw.com/ixSfT00g9t2h

xyl52p 发表于 2022-2-22 16:44

感谢楼主分享,看起来生成的图片效果不错,不知道GIF背景会不会影响识别率。

heidi53669363 发表于 2023-3-14 12:09


感谢楼主分享,看起来生成的图片效果不错
页: [1]
查看完整版本: 基于MYQR库的批量生成带图片背景的二维码(支持GIF)