青

一言

Webp 图片格式

Webp 图片格式

Webp 图片格式

Webp 是“一种适用于网络的图片格式“,由 Google 开发,发布于 2010 年,Google Chrome、Safari、Firefox、Edge、Opera 浏览器以及许多其他工具和软件库就原生支持 WebP。

在谷歌网站上,对 Webp 格式有这样的总结:

WebP 是一种现代图片格式,可为网络上的图片提供出色的无损和有损压缩。使用 WebP,网站站长和 Web 开发者可以创建更小、更丰富的图片,从而提高网页加载速度。

与 PNG 相比,WebP 无损图片的尺寸缩小了 26%。WebP 有损图片比采用等效 SSIM 质量指数的同等 JPEG 图片小 25-34%。

Webp 的压缩技术是基于 VP8 视频编解码器,以及一些专门为图片设计的预测编码技术。Webp 支持无损压缩、透明度、动画和多页图片。通过官方文档来了解更多

Webp 的文件格式参考 Webp 容器规范

cwebp 的使用

libwebp 代码库归档中提供了cwebp、dwebp、gif2webp工具盒 WebP 库和 C 头文件。

具体使用方法参考 docs 中的 tools.md 和 api.md。

快速上手:

1
./cwebp -i 输入文件.png -p 80 -o 输出文件.webp

此命令将输入的 png 图片转换为 80% 质量的 webp 图片。

1
./cwebp -i 输入文件.png -o 输出文件.webp -lossless

此命令将输入的 png 图片转换为无损 webp 图片。

通过简单的测试,发现 webp 格式的图片在保证质量的情况下,文件大小相比于 png 格式的图片有明显减小,基本达到了官方文档中的描述。

Go 语言中的小工具

除了cwebp,还有自己写的小工具,批量单个转换都是可以的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package main

import (
"bytes"
"fmt"
"github.com/chai2010/webp"
"image"
_ "image/gif"
_ "image/jpeg"
_ "image/png"
"os"
"path/filepath"
"strings"
)

func main() {
if len(os.Args) < 2 {
fmt.Println("Usage: png2webp <input.png>|<dir> [quality] [-lossless] [-dir_walker]")
return
}
// try to get quality and lossless
quality := 80
lossless := false
dirWalker := false
for _, arg := range os.Args[2:] {
if strings.HasPrefix(arg, "-") {
if strings.HasPrefix(arg, "-lossless") {
lossless = true
}
if strings.HasPrefix(arg, "-dir_walker") {
dirWalker = true
}
} else {
_, _ = fmt.Sscanf(arg, "%d", &quality)
}
}
if dirWalker {
// 遍历目录
err := filepath.Walk(os.Args[1], func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
// check png jpg jpeg gif
if !strings.HasSuffix(strings.ToLower(path), ".png") &&
!strings.HasSuffix(strings.ToLower(path), ".jpg") &&
!strings.HasSuffix(strings.ToLower(path), ".jpeg") &&
!strings.HasSuffix(strings.ToLower(path), ".gif") {
return nil
}
// convert
png2webp(path, lossless, quality)
return nil
})
if err != nil {
fmt.Printf("执行过程中出错:%s\n", err)
return
}
} else {
png2webp(os.Args[1], lossless, quality)
}
}

func png2webp(path string, lossless bool, quality int) {
// 输入和输出文件名
//inputFileName := os.Args[1]
outputFileName := strings.TrimSuffix(path, filepath.Ext(path)) + ".webp"
// 打开输入文件
inputFile, err := os.Open(path)
if err != nil {
fmt.Printf("无法打开输入文件:%s\n", err)
return
}
defer inputFile.Close()
// 读取图片,不再仅限于 PNG 格式
pngImage, f, err := image.Decode(inputFile)
fmt.Printf("读取图片:%s\n", f)
if err != nil {
fmt.Printf("无法解码 PNG 图片:%s\n", err)
return
}
// 创建一个内存缓冲区用于存储转换后的 WebP 图片
var webpBuffer bytes.Buffer
// 将 PNG 图片编码为 WebP 格式
if lossless {
err = webp.Encode(&webpBuffer, pngImage, &webp.Options{Lossless: true})
} else {
err = webp.Encode(&webpBuffer, pngImage, &webp.Options{Quality: float32(quality)})
}
if err != nil {
fmt.Printf("无法编码为 WebP 格式:%s\n", err)
return
}
// 将转换后的 WebP 数据写入到输出文件
err = os.WriteFile(outputFileName, webpBuffer.Bytes(), 0666)
if err != nil {
fmt.Printf("无法写入输出文件:%s\n", err)
return
}
fmt.Println("图片转换成功!")
}

本文的封面图片原始链接, 作者:Luc Viatour,作者相关链接

本文作者:
本文链接:https://tdh6.top/%E6%9D%82%E9%A1%B9/webp/
版权声明:本站文章采用 CC BY-NC-SA 3.0 CN 协议进行许可,翻译文章遵循原文协议。
图片来源:本站部分图像来源于网络,前往查看 相关说明。