批量生成二维码打包成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)
很多东西是写死的  比如下载文件的路径 生成图片的路径  以及背景图名称 
"""

 

posted @ 2018-01-22 16:11  zeroonec  阅读(921)  评论(0编辑  收藏  举报