文档章节

「Python」PNG OR JPG Convert to WebP

蔡小鹏
 蔡小鹏
发布于 2018/04/07 19:40
字数 914
阅读 262
收藏 0

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

Webp

WebP-Converter

© 著作权归作者所有

共有 人打赏支持
蔡小鹏
粉丝 36
博文 42
码字总数 72954
作品 0
海淀
Android工程师
私信 提问
加载中

评论(1)

长腿小胖墩
好 支持大佬
聊一聊几种常用web图片格式:gif、jpg、png、webp

前言 在大多数的web页面中,图片占到了页面大小的60%-70%。因此在web开发中,不同的场景使用合适的图片格式对web页面的性能和体验是很重要的。图片格式种类非常多,本文仅针对几种web应用中常...

antwang
2018/06/27
0
0
【省带宽、压成本专题】带宽成本降低50%的秘密——深入解析WebP

过去几年,又拍云一直在点播、直播等视频应用方面潜心钻研,取得了不俗的成果。我们结合点播、直播、短视频等业务中的用户场景,推出了“省带宽、压成本”系列文章,从编码技术、网络架构等角...

又拍云
2018/06/12
0
0
如何通过WebP兼容方案来减少图片体积?

为什么要使用WebP自适应方案? 无缝适配各浏览器和移动端。又拍云CDN自动判断对于支持的客户端,响应 WebP 格式的图片;不支持的客户端,响应原图。 支持多种图片格式转换。动态GIF、JPG、P...

又拍云
2017/05/24
162
2
微软 Edge 开始支持 Chrome 主推的 .webp 图片格式

可能已经有相当一部分网友开始发现自己从 Chrome 下载的图片格式是 .webp。 WebP 是谷歌从 2010 年开始主推的一种图片压缩格式,可以保持画质、无损地将 png 图片的体积缩小 45%,这对于网页...

局长
2018/06/16
1K
6
Edge浏览器开始支持Chrome主推的.webp图片格式

可能已经有相当一部分网友开始发现自己从Chrome中下载的图片格式是.webp。WebP是谷歌从2010年开始主推的一种图片压缩格式,可以保持画质、无损地将Png图片的体积缩小45%,这对于网页的快速加...

快科技
2018/06/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

VMware下centos7.x 用yum快速搭建LAMP平台

实验环境: [root@nmserver-7 html]# cat /etc/redhat-release CentOS release 7.3.1611 (AltArch) [root@nmserver-7 html]# uname -aLinux nmserver-7.test.com 3.10.0-514.el7.cent......

皇冠小丑
今天
1
0
搜索引擎(Solr-索引详解)

时间字段类型特别说明 Solr中提供的时间字段类型( DatePointField, DateRangeField,废除的TrieDateField )是以时间毫秒数来存储时间的。 要求字段值以ISO-8601标准格式来表示时间:YYYY-MM...

这很耳东先生
今天
6
0
Java成神之路

1、基础篇 01、面向对象 → 什么是面向对象 面向对象、面向过程 面向对象的三大基本特征和五大基本原则 → 平台无关性 Java 如何实现的平台无关 JVM 还支持哪些语言(Kotlin、Groovy、JRuby...

asdf08442a
今天
3
0
dubbo源码分析-服务导出

简介 dubbo框架spring Schema扩展机制与Spring集成,在spring初始化时候加载dubbo的配置类。 dubbo服务导出的入口类是ServiceBean的onApplicationEvent方法 ServiceBean的继承关系如下 publ...

王桥修道院副院长
今天
2
0
QQ音乐的动效歌词是如何实践的?

本文由云+社区发表 作者:QQ音乐技术团队 一、 背景 1. 现状 歌词浏览已经成为音乐app的标配,展示和动画效果也基本上大同小异,主要是单行的逐字染色的卡拉OK效果和多行的滚动效果。当然,我...

腾讯云加社区
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部