栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python:PNG/JPG Convert to Webp

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python:PNG/JPG Convert to Webp

PNG/JPG Convert to Webp(Python) 前言

关于webp 的优势以及原理性的东西,之前看过腾讯的一篇文章.WebP原理和Android支持现状介绍

webp 图片格式兼容到Android4.0,之前转换webp的时候都是通过在线转换器,不过效率是在是太慢了,单张还好,批量转换就很痛苦了,故本人写了一个python 脚本来实现自动化批量将png 或者 jpg 转换为webp

环境搭建
  • webp环境

    Mac 可以使用homebrew来安装实用程序。

    brew install webp

    安装实用程序完成后,就可以使用 cwebp命令 将 JPEG 或 PNG 图像转换成 webp 格式, 也可以通过dwebp 命令将 webp 图像转换回 PNG、PAM、PPM 或 PGM 图像。

    示例

    cwebp [options] -q quality input.jpg -o output.webp  

    质量选项应该是 0 (差)到 100 (很好)之间的数字,典型的质量值大约是 80,也可以多尝试几个数值。本人一般转图片时质量用的是80

    dwebp input_file.webp [options] [-o output_file]
  • python 环境

    python现在已经很火了,网上关于python的环境搭建也有很多,Google下下了,如果想学习python的话,推荐廖雪峰老师的教程,还是比较容易懂的。廖雪峰老师Python

需求分析

了解了上面的cwebp命令,下面就用python对cwebp 进行一个简单的封装就好了。首先我希望quality是可配置的;另外我还希望有一个默认大小的配置,比如改文件夹下低于20kb的我希望用原图,不将其转换为webp
下面直接贴代码。大思路是这样:首先去检查参数,文件夹路径等,默认输出到原文件夹_webp下面,转换完以后统一copy并删除原文件

# encoding=utf-8

#  -s 最小要压缩图片大小 (kb)
#  -i 要压缩的图片文件夹目录
#  -q 压缩图片质量  默认80

import commands
import os
import sys
import getopt
import shutil

input_file = "" 
quality = "80"

outputPath = input_file + "_webp"

compressSize = ""

def handle_sys_arguments():
    opts, args = getopt.getopt(sys.argv[1:], "hi:o:q:s:")
    global quality
    global output_file
    global compressSize
    global input_file

    for op, value in opts:
 # print("op:" + op + "__" + value)
 if op == "-i":
     input_file = value
 elif op == "-o":
     output_file = value
 elif op == "-h":
     print(" -s 最小要压缩图片大小 (kb)n -i 要压缩的图片文件夹目录n -q 压缩图片质量  默认80")
     exit()
 elif op == "-q":
     quality = value
 elif op == "-s":
     compressSize = value

def path_file(path):
    for i in os.listdir(path):
 print(i)
 new_path = os.path.join(path, i)
 if os.path.isfile(new_path):
     transform(new_path)
 else:
     path_file(new_path)

def transform(f):
    split_name = os.path.splitext(f)
    filePath = f

    print(split_name[0])

    if split_name[1] == ".webp" or (split_name[1] != ".jpg" and split_name[1] != ".png"):
 return

    if compressSize.strip() != "" and os.path.getsize(filePath) / 1024.0 > int(compressSize):
 command = "cwebp -q " + quality + " " + filePath + " -o " + 
    split_name[0] + ".webp"
 commands.getstatusoutput(command)
 print("执行了:" + command)
    elif compressSize.strip() == "":
 command = "cwebp -q " + quality + " " + filePath + " -o " + 
    split_name[0] + ".webp"
 commands.getstatusoutput(command)
 print("执行了:" + command)
    else:
 print("不压缩")

def check_args():
    if input_file.strip() == "":
 print("请输入要转换的文件夹路径")
 exit()

def copy_webp_files(sourceDir, targetDir):
    if not os.path.exists(targetDir):
 os.makedirs(targetDir)

    print sourceDir
    print(targetDir)

    for file in os.listdir(sourceDir):

 new_source_path = os.path.join(sourceDir, file)
 new_target_path = os.path.join(targetDir, file)

 # print("copyWebpFiles" + new_source_path)
 # print("copyWebpFiles_target" + new_target_path)

 if os.path.isdir(new_source_path):

     copy_webp_files(new_source_path, new_target_path)

 else:
     splite_name = os.path.splitext(file)
     print("copyWebpFiles_split" + splite_name[1])

     if splite_name[1] != ".webp":  # 只复制webp文件
  continue

     shutil.copy(new_source_path, new_target_path)
     os.remove(new_source_path)

if __name__ == '__main__':
    handle_sys_arguments()
    check_args()
    path_file(input_file)
    copy_webp_files(input_file, outputPath)
示例

我在桌面建立一个文件夹,里面放了一些需要抓换的图片,需要将这些图片全部转换为webp,输入命令

python /Users/work/Desktop/webp_converter.py  -i /Users/work/Desktop/img

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/222379.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号