批量生成二维码打包成exe文件
需求: 根据url 和 文件名称 生成二维码 将二维码放到背景图上合成一张二维码
思路: 使用qrcode库 获取二维码 保存本地 全部完成后 与本地背景图合成 最后使用pyinstaller将python打包成exe文件
# -*- coding: utf-8 -*- import urllib; import os import time import threadpool from PIL import Image import qrcode path = os.getcwd() + os.path.sep + 'finally' if not os.path.exists(path): os.makedirs(path) print 'create folder ' + path path = os.getcwd() + os.path.sep + 'download' if not os.path.exists(path): os.makedirs(path) print 'create folder ' + path def downloadImg(line): url = 'http://qr.liantu.com/api.php?text=' + line.split()[0] name = line.split()[1] print '\n downloading ' + path + os.path.sep+ '%s.jpg' % name urllib.urlretrieve(url, path + os.path.sep+ '%s.jpg' % name) def generateQRcodeLocal(line): qr = qrcode.QRCode(version=1,error_correction=qrcode.constants.ERROR_CORRECT_L,box_size=15,border=1,) qr.add_data(line.split()[0].strip()) qr.make(fit=True) name = line.split()[1].strip() img = qr.make_image() imagename = path + os.path.sep+ '%s.jpg' % name print '\n name:' + name + '\t imagename:' + imagename img.save(imagename) cropImg(name) def cbk(a,b): print '' % a print '' % b def cropImg(imgname): #imgname=line.split()[1] #加载底图 base_img = Image.open(ur'bg.jpg') # 可以查看图片的size和mode,常见mode有RGB和RGBA,RGBA比RGB多了Alpha透明度 # print base_img.size, base_img.mode box = (349,403,1141,1195) # 底图上需要P掉的区域 try: #加载需要P上去的图片 tmp_img = Image.open(ur'download\%s.jpg' % imgname) #这里可以选择一块区域或者整张图片 #region = tmp_img.crop((0,0,304,546)) #选择一块区域 #或者使用整张图片 region = tmp_img #使用 paste(region, box) 方法将图片粘贴到另一种图片上去. # 注意,region的大小必须和box的大小完全匹配。但是两张图片的mode可以不同,合并的时候回自动转化。如果需要保留透明度,则使用RGMA mode #提前将图片进行缩放,以适应box区域大小 # region = region.rotate(180) #对图片进行旋转 region = region.resize((box[2] - box[0], box[3] - box[1])) base_img.paste(region, box) #base_img.show() # 查看合成的图片 base_img.save(ur'finally\%s.jpg' % imgname) #保存图片 except IOError,e: print 'fail to crop image:' + imgname + '.jpg' name_list =[] for line in open('list.txt','r'): if line.strip(): name_list.append(line) # print line.split()[0] print 'total size:' + str(len(name_list)) start_time = time.time() totalThread = 50 if len(name_list) >= 5000: totalThread = 80 if len(name_list) >= 10000: totalThread = 100 print 'total thead size:' + str(totalThread) pool = threadpool.ThreadPool(totalThread) requests = threadpool.makeRequests(generateQRcodeLocal, name_list) map(pool.putRequest, requests) #[pool.putRequest(req) for req in requests] pool.wait() # 阻塞线程 #pool.poll() # 不阻塞线程 #print 'start crop img now..... total size:' + str(len(name_list)) #for line in name_list: #cropImg(line.split()[1]) print 'fail to generate image file size:' + str(error_size) result = input( 'total cost: ' + '%d second'% (time.time()-start_time) + ' press any key to exit...') os._exit() """ 这个程序主要是任务是获取url从网上生成二维码下载到本地 再放到背景图上 背景图的区域是该区域使用四元组来指定。四元组的坐标依次是(左,上,右,下)。PIL 中指定坐标系的左上角坐标为(0,0) 很多东西是写死的 比如下载文件的路径 生成图片的路径 以及背景图名称 """