您的位置:首页 > 编程语言 > Python开发

批量生成二维码打包成exe文件

2017-07-31 16:22 453 查看
需求:  根据url 和 文件名称 生成二维码   将二维码放到背景图上合成一张二维码
思路: 发送请求至http://qr.liantu.com获取二维码 保存本地  下载全部完成后 与本地背景图合成   最后使用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)
很多东西是写死的 比如下载文件的路径 生成图片的路径 以及背景图名称
"""


第一次改进: 网络生成有毒 使用qrcode库去生成  调节了并发线程数量  达到加速的效果。 win8同级目录下6AJD.jpg 和 6AJd.jpg不能共存 ,注意这个坑

打包好的exe文件和说明已经上传到csdn上了  http://download.csdn.net/detail/cjvs9k/9917300

遇到一些问题 
PIL安装  直接去官网下载exe文件 (本人win8系统)
多线程阻塞  资料不完整 导致  下载图片需要阻塞线程的

http://www.cnblogs.com/lilinwei340/p/6474170.html
http://blog.csdn.net/u013378306/article/details/70156842
http://blog.csdn.net/mrlevo520/article/details/51840217

I'm fish. I'm on.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 二维码生成