美文网首页
Mac python3 批量转换png为webp

Mac python3 批量转换png为webp

作者: 郑永博 | 来源:发表于2020-10-28 17:45 被阅读0次

    方式一(推荐)

    使用

    1 放在project根目录
    2 执行脚本

    #coding=utf-8
    
    # 遍历目标文件夹内所有的 jpg 图片,转换成 webp 格式,可自行配置压缩比,默认75
    # 环境:python 2.7或3.0
    # 本脚是基于PIL(Python Imaging Library)基础上实现的,而 Pillow是PIL一个分支,提供更加强大的功能,执行脚本之前需要安装 Pillow 模块
    # 执行脚本:**python image2webp.py [option] [arg] ...**
    # 以option与arg参数配置脚本:
    # -q:图片压缩率, 整形:1-100, 默认:75。例子:python image2webp.py -q 80
    # -d:删除原文件,默认不删除。例子python image2webp.py -d
    # -h:打印帮助
    #
    
    import os
    import sys, getopt
    from PIL import Image
    
    # 以目标文件夹为起点的输出目录
    output_file = '.'
    # 目标文件目录
    input_file = '.'
    # 是否只展示帮助
    is_help = False
    # 是否删除原文件
    is_delete_origin = False
    # 压缩率
    quality = 75
    # 总数(可转成webp的文件总数)
    total = 0
    # 记录转换成功的个数
    count = 0
    # 支持处理的图片格式
    image_ext = ['.png', '.jpg']
    
    
    def deleteFile(file):
        if not is_delete_origin:
            return
        try:
            os.remove(file)
        except (Exception) as e:
            print('delete ' + file + ' message:' + e.message)
    
    
    def convert(file):
        global total
        global count
        # 获取文件名与文件后缀
        fname,fext = os.path.splitext(file.split("/")[-1])
        # 检测是否为支持的图片格式
        if not fext in image_ext:
            return
        #过滤掉.9图片
        if '.9.png' in file:
            return
        
        # 如果是png图片,检测是否有透明与半透明区域
        if fext == '.png':
            try:
                im = Image.open(file).convert("RGBA")
                alpha = im.split()[-1]
                alphadata = list(alpha.getdata())
                length = len(alphadata)
                for x in range(0, length-1):
                    a = alphadata[x]
                    if a < 255:
                        # 有透明区域,直接跳过此图片
                        return
            except (Exception) as e:
                print(e)
    
        path = os.path.split(os.path.abspath(file))[0]
        #统计个数
        total += 1
        try:
            im = Image.open(file).convert("RGB")
            # 拼接文件名
            webpfile = '%s/%s.webp'%(path, fname)
            #print(webpfile)
            # 获取文件路径
            filepath = os.path.dirname(webpfile)
            # 若目标文件夹不存在创建
            if not os.path.exists(filepath):
                os.makedirs(filepath)
            # 保存webp格式,指定压缩率
            im.save(webpfile, "WEBP", quality = quality)
            count +=1
            print('convert %s success'%file)
            # 根据需要删除原文件,默认不删除
            deleteFile(file)
        except (Exception) as e:
            print(file+' fail: ' + e.message)
    
    
    def listDir(rootDir):
        # 迭代变量文件夹及子文件夹
        for lists in os.listdir(rootDir):
            pathformat = '%s/%s'
            if rootDir == './':
                pathformat = '%s%s'
            path = os.path.join(pathformat % (rootDir, lists))
            if not 'intermediates' in path:
                convert(path)
                if os.path.isdir(path): 
                    listDir(path) 
            
    
    
    def handleArguments():
        # 获取所有命令
        opts, args = getopt.getopt(sys.argv[1:], "hdq:")
    
        global input_file
        global output_file
        global is_help
        global is_delete_origin
        global quality
    
        for op, value in opts:
            option = op
            if op == "-q":
                quality = value
            # 删除原文件
            elif op == "-d":
                is_delete_origin = True
            elif op == "-h":
                is_help = True
                print("\
                usage: python jpg2webp.py [option] [arg] ...\n\
                Options and arguments (and corresponding environment variables): \n\
                    -q:  image quality, Integer:1-100, Defaults to 75. \n\
                    -d:  delete origin image file\n\
                    -h:  print this help message")
    
    
    if __name__ == '__main__':
        handleArguments()
        if not is_help:
            print('quality is %d, start...'%quality)
            listDir(input_file)
            print('finish! total:%d, success:%d' % (total,count))
    

    方式二

    import glob
    import os
    import threading
    
    from PIL import Image
    
    
    def create_image(infile, index):
     file_name, extension_name = os.path.splitext(infile)
     im = Image.open(infile)
     im.save("img_webp/" + file_name.split('/')[1] + ".webp", "WEBP")
    
    
    def start():
     index = 0
     for infile in glob.glob("img/*.png"):
      t = threading.Thread(target=create_image, args=(infile, index,))
      t.start()
      t.join()
      index += 1
    
    
    if __name__ == "__main__":
     start()
    
    WeChat11401230be365979323fbdcffe5bbedd.png

    PIL找不到

    pip3 install Pillow
    

    使用

    1 创建img、img_webp统一目录
    2 同级目录下执行脚本

    python3 png2webp.py
    

    相关文章

      网友评论

          本文标题:Mac python3 批量转换png为webp

          本文链接:https://www.haomeiwen.com/subject/ohmqvktx.html