zoukankan      html  css  js  c++  java
  • 批量生成二维码打包成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 '
     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 '
     name:' + name +  '	 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)
    很多东西是写死的  比如下载文件的路径 生成图片的路径  以及背景图名称 
    """
  • 相关阅读:
    docker建镜像
    注册路由的简易实现
    docker的小技巧记录(如果使用了更多会继续添加)
    Alembic使用
    SQLAlchemy的常用数据类型
    记录SQLAlchemy的基本使用
    linux创建桌面快捷方式
    vim编辑器命令
    redis发布订阅
    谨慎使用mysql的utf8
  • 原文地址:https://www.cnblogs.com/zeroones/p/8329511.html
Copyright © 2011-2022 走看看