上传图片转 WebP 插件


上传图片转 WebP 插件

自动将后台/前台上传的 JPG / PNG / GIF / BMP 图片转换为 WebP 格式,保持像素尺寸不变,在视觉无损前提下大幅减小文件体积,节省存储空间与 CDN 流量。


功能特性

三级降级压缩:cwebp(Google 官方)> Imagick 扩展 > GD 库,自动探测并选择最优工具

透明通道保留:PNG / GIF 透明背景转 WebP 后仍保留透明,不会变黑

安全兜底:转换失败、体积未减小、工具缺失时,自动回退保留原文件,不影响上传流程

只保留更小结果:压缩后体积 ≥ 原图时,自动删除 WebP 并保留原文件

不修改尺寸:仅转换格式和压缩质量,不缩放分辨率

hook 挂载:监听 upload_file_save_after 系统钩子,分片合并成功后才开始转换,不影响上传进度条

环境要求

项目 要求

ThinkCMF 版本 X 系列(支持 upload_file_save_after 钩子)

PHP 版本 7.4+ / 8.x(推荐 8.2)

PHP 扩展 ext-zip(打包用),GD 或 Imagick 至少其一,最好装 cwebp

可选优化 安装 webp 系统包(cwebp 命令行工具,压缩率最高)

cwebp 安装(推荐,压缩质量和体积最佳)


Bash


1

2

3

4

5

6

7

8

9

10

11

# Debian / Ubuntu

sudo apt-get install webp


# CentOS / RHEL

sudo yum install libwebp-tools


# macOS (Homebrew)

brew install webp


# Windows:下载 https://developers.google.com/speed/webp/download

# 解压后把 cwebp.exe 放到 C:\webp\cwebp.exe 或 PATH 任意目录

安装方法

方式一:后台插件管理安装(推荐)

登录后台 → 插件管理 → 上传安装插件

选择 plugin_upload_image_to_webp_xxxxxx.zip 包上传

安装成功后,在插件列表点「启用」

方式二:命令行直接打包分发


Bash


1

2

3

# 在已开发好的项目根目录执行

php think publish:plugin UploadImageToWebp

# 输出:D:\www\ThinkCMF/data/publish/plugin_upload_image_to_webp_YYYYMMDD_HHMMSS.zip

方式三:手动部署

将 upload_image_to_webp 目录拷贝到目标项目 public/plugins/ 下

登录后台 → 插件管理,扫描新插件后安装并启用

安装流程会自动:


在 cmf_hook 表注册 upload_file_save_after 系统钩子(如不存在)

在 cmf_hook_plugin 表挂载插件到钩子

清钩子缓存,立即生效

配置说明

插件后台 → 设置 页可配置以下参数:


配置项 类型 默认值 说明

启用转换 开关 开启 关闭后所有上传图片保持原格式

压缩质量 数字 85 WebP 质量 0-100,见下方质量对照表

小于多少不压缩(KB) 数字 700 小于该大小的图片跳过转换(小图收益低),设为 0 表示不限制

质量对照表

场景 推荐质量 效果

截图 / 后台表单截图 / 含文字海报 80-85 文字边缘锐利,无模糊感

产品照片 / 风景图(无文字) 70-75 视觉无损,体积甜点区

用户头像 / 小缩略图 60-65 体积最小,可见损失可接受

追求近乎无损 85-90 体积稍大,最高保真

极致压缩,能接受画质损失 50-60 体积缩减最大

使用流程

进入插件设置 → 先看「环境检测」是否打勾 ✔,最好三个工具至少有一个可用

调整「压缩质量」和「小于多少不压缩」两个参数,保存

正常上传图片即可,插件自动处理,无需人工介入

转换后的效果

上传入口:不区分,所有 file_type=image 的走钩子都会触发(文章配图、幻灯片、用户头像、自定义上传)

文件路径:新 .webp 与原文件同目录、同名换后缀;原文件自动删除(有收益时)

数据库:cmf_upload_file 表的 file_path、md5、sha1 自动为 WebP 新文件

云存储:如果项目配了云存储钩子,上传到云端的就是压缩后的 WebP 文件

目录结构


Plain Text


1

2

3

4

5

6

upload_image_to_webp/

├── UploadImageToWebpPlugin.php   # 主入口类(钩子处理、安装、卸载)

├── config.php                    # 插件配置表单 + 环境检测

├── lib/

│   └── WebpCompressor.php        # WebP 压缩核心类(cwebp / Imagick / GD 三级降级)

└── README.md                     # 本说明

常见问题

Q: 为什么有些图片没转?


图片已经是 .webp 后缀 → 直接跳过,避免重复压缩

体积小于「小于多少不压缩」阈值 → 小图转了反而可能变大

转换后体积比原图还大 → 自动保留原文件,删除 WebP

Q: 后台设置里环境检测三个都是 ✘?


无任何可用工具时插件会静默跳过不压缩,不报错。建议装 cwebp 或启用 GD/Imagick

Q: 转换后背景变黑?


GD 库对 PNG 透明支持有限,升级为 Imagick 或 cwebp 可完美保留

Q: 卸载插件会删除已上传的 WebP 图片吗?


不会。卸载仅解除钩子挂载和清缓存,不碰任何上传文件

版本历史

版本 日期 变更

1.0.0 - 初始版本:三级降级压缩、透明通道保留、大小阈值过滤

1.0.1 2026-08-19 移除「大于多少不压缩(KB)」配置,超大图也尝试转换


ThinkCMF模板插件交流群:550851374 ,领取阿里云1000通用代金券

评论

暂时关闭,稍后恢复~
文档请看10遍以上!有问题可加QQ群!
发布插件

七牛专享优惠码

507670e8

ThinkCMF教程