需求: 根据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)
很多东西是写死的 比如下载文件的路径 生成图片的路径 以及背景图名称
"""
遇到一些问题
PIL安装 直接去官网下载exe文件 (本人win8系统)
多线程阻塞 资料不完整 导致 下载图片需要阻塞线程的
I'm fish. I'm on.