Webp:图片压缩算法

komantao 2020-02-12 2020-02-12 字数 1492 阅读量


WebP是Google推出的一种新式图片格式,为Web上的图像提供出色的无损和有损压缩。相比于常用的jpg、png和gif格式,最大的优势就是同等质量下压缩率更高、图片文件更小、利于节约存储空间和网络带宽。

根据Google的测试,无损压缩后的WebP比PNG文件少了45%的文件大小,即使这些PNG文件经过其他压缩工具压缩之后,WebP还是可以减少28%的文件大小。

WebP官网(需要科学上网):https://developers.google.com/speed/webp/。

一、概述

Google提供了一组工具集合,叫libwebp,其中包括各种webp相关转换的命令:

  • img2webp

    输入一系列静态图像(PNG、JPEG、TIFF、WebP),创建一个动态WebP文件。

    # 语法
    img2webp [file-level options] [image files...] [per-frame options...]
    # 示例
    img2webp -loop 0 -d 2000 01.png 02.png 03.png -o out.webp
    
  • cwebp

    将JPEG、PNG或TIFF编码成WebP。

    # 语法
    cwebp [options] in_file [-o out_file]
    # 示例
    cwebp -s 600 300 -q 80 input.png -o output.webp
    
    • -s <int> <int>:输入大小(宽度x高度)
    • -q <int>:压缩率[0,100]
  • dwebp

    将WebP解码成PNG。

  • vwebp

    webp图片浏览器。命令行输入命令,在桌面上弹出一个GUI窗口显示图片:

    vwebp output.webp
    
  • webpmux

    WebP muxing tool。

  • gif2webp

    将GIF转换为webp图片。

1、安装

  1. 下载WebP Converter,根据对应系统平台选择版本,解压安装

  2. 配置环境变量

    计算机 — 右键 — 系统属性 — 环境变量 — 系统变量 — Path,将下载的webp工具解压后的bin目录加入Path环境变量。

2、制作webp动图

png序列帧转换webp动画:

  • 使用WebP Converter提供的img2webp工具

    要求图片分辨率一致。

  • cwebp + webpmux

    先将png文件通过cwebp工具分别进行转换为webp静态序列,质量压缩等自己可以根据需求转换,然后在用webpmux 工具,将所有的webp静态序列打包成webp动态动画。

命令行操作:

  1. 打开命令行工具(例如cmd、Git Bash等),cd切换到图片所在目录

  2. 输入命令,转换图片格式

    根目录的Readme.txt是命令的帮助文档

    $ img2webp -loop 0 -d 2000 01.png 02.png 03.png -o out.webp
    output file: out.webp     [3 frames, 17560 bytes].
    
    • 输入文件:01.png、02.png、03.png,要求分辨率一致
    • -loop <int>:循环计数(默认值:0,=无限循环)
    • -d 2000:图片持续停留时间(毫秒)
    • -o out_file:指定输出WebP文件的名称

脚本(shell)文件(假设保存为img2webp.sh):

read -p "请输入图片路径(默认:g:/下载): " var
path=${var:-"g:/下载"}                                    # 设置默认路径,若变量var为null或为空字符串时,则path="g:/下载"
read -p "请输入图片关键字(默认后缀为PNG或JPG): " keyword
filelist=`ls $path/*$keyword*.{png,jpg}`                  # 筛选图片(指定路径、关键字、后缀默认为PNG或JPG)
echo "目标图片:" $filelist

imgs=''
for file in $filelist
    do 
        imgs=$imgs$file" "
    done
img2webp -loop 0 -mixed -d 2000 $imgs -o $path"/"out.webp   # 执行转换命令
  • 将脚本文件放入WebP Converter的bin目录(已设置了环境变量,可任意路径使用)
  • 根据路径、名称关键字和后缀筛选目标图片

3、图像压缩

使用谷歌webp压缩图片,在JPEG和PNG上的转化效果非常优秀、稳定和统一。

核心压缩命令简写如下:

cwebp input.png -q 80 -o output.webp

使用Python编写的批处理脚本:

# -*- coding: utf-8 -*-
from glob import glob
import os
from  threading import Thread

import logging
from PIL import Image


def convert_img_type(infile, index):

  encoder_path = "C:/Users/ruonan/libwebp-1.0.0-windows-x64/bin/cwebp.exe"
  output_path = "C:/Test01/20150806205033/webp/"
  if not os.path.exists(output_path):
    os.mkdir(output_path)
  new_size = get_new_size(infile)
  commond = encoder_path + " -q 80 -resize " + str(new_size[0]) + " " + str(new_size[1]) + " " +infile + " -o "+output_path + str(index) + ".webp"
  os.system(commond)


def get_new_size(infile):
  img = Image.open(infile)
  width = img.size[0]
  height = img.size[1]
  phone_px = 500
  scale = float(phone_px) / width
  if width <= phone_px:
    return width,height
  else:
    height = int(height * scale)
  return phone_px, height

def start():
  index = 1
  input_path = "C:/Test01/20150806205033/*.jpg"
  for infile in glob(input_path):
    print infile
    t = Thread(target=convert_img_type, args=(infile, index,))
    t.start()
    t.join()
    index += 1


if __name__ == "__main__":
  start()

参考资料

  • []()
  • []()
  • []()

操作环境

  • 操作系统:Win 10

感谢您的赞赏支持:

Copyright © 2020 komantao. All Rights Reserved.