XCJ's Blog

XCJ

无缝将图片资源转换为WebP格式

2024-09-16

WebP 介绍

WebP 格式是一种现代的图像文件格式,由 Google 于2010年推出。它旨在提供更好的压缩效率,以减少文件大小并提高加载速度,特别是在网页上使用的标准图像格式(如 JPEG、PNG 和 GIF)的情况下。

使用 WebP Server Go 程序,可便捷的将 JPEG、PNG 等格式的图片动态转换为 WebP 格式,并且它也支持缓存,相同的图像请求在第一次转换后会存储在缓存中,后续请求可以直接从缓存中获取,无需再次转换。利用 Go 的高性能特性,WebP Server Go 能够高效处理大量并发请求,并快速转换图像。

个人使用案例

个人实测,使用 WebP Server Go 转换的 WebP 图片,某些图片可达 90% 的恐怖压缩率:

左侧的图片为 WebP 格式(虽然图片路径为 PNG 后缀,但实际返回的是 WebP 格式),尺寸为 1200x700 像素,文件大小不到 50KB。而右侧的原始 PNG 图片(经过压缩处理)约为 500KB。

重要说明:此数据仅基于本次测试的图片,转换质量为默认值(80%)。

部署 WebP Server Go 程序

本文将简要介绍使用 Docker Compose 进行部署,其他部署方式和参数请参考 WebP Server Go 文档

在 docker-compose.yml 文件的目录下,运行 docker-compose up -d 命令来启动服务。以下是 docker-compose.yml 文件的内容:

version: '3'

services:
  webp:
    image: webpsh/webp-server-go
    restart: always
    environment:
      - WEBP_ALLOWED_TYPES=* # 将所有支持的类型都进行转换
      - WEBP_ENABLE_EXTRA_PARAMS=true # 开启图像转换,例如在路径后添加 ?width=20 参数
    volumes:
      - /path/to/pics:/opt/pics # 源文件目录
      - ./exhaust:/opt/exhaust # 缓存目录
      - ./metadata:/opt/metadata # 元数据目录
    ports:
      -  127.0.0.1:3333:3333

使用 nginx 将图片资源路径反向代理到 127.0.0.1:3333,从而实现将图片资源无缝转换为 WebP 格式。

https://www.halo.run/为例,它上传到服务器本地存储的资源路径为 /upload/,在 nginx 配置中的 server 块内添加该代码:

location ^~ /upload/ {
  proxy_pass http://127.0.0.1:3333;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_hide_header X-Powered-By;
  proxy_set_header HOST $http_host;
  add_header Cache-Control 'no-cache, max-age=86400';
}

注意将 docker-compose.yml 文件中的源文件目录修改为 Halo 的存储策略目录。