图片与视频处理
这页适合作为“媒体素材处理入口”。可以把它简单理解成三类工具分工:
- ImageMagick:命令行万能图片处理
- Sharp:Node.js 项目里的高性能图片处理
- FFmpeg:视频与音频处理主力
先分清自己是做图片、做视频,还是做批处理流程,再选工具会更顺。
ImageMagick
强大的命令行图片处理工具。
scoop install imagemagick
常用操作
# 格式转换
magick input.png output.jpg
magick input.png output.webp
# 调整大小
magick input.jpg -resize 800x600 output.jpg
magick input.jpg -resize 50% output.jpg
# 批量转换
magick mogrify -format webp -quality 85 *.png
# 裁剪
magick input.jpg -crop 400x300+100+50 output.jpg
# 压缩质量
magick input.jpg -quality 80 output.jpg
# 添加水印
magick input.jpg -gravity southeast -fill white \
-pointsize 24 -annotate +10+10 "DomiVault" output.jpg
# 拼接图片
magick input1.jpg input2.jpg +append horizontal.jpg # 水平
magick input1.jpg input2.jpg -append vertical.jpg # 垂直
# 生成缩略图
magick input.jpg -thumbnail 200x200^ -gravity center -extent 200x200 thumb.jpg
Sharp(Node.js)
高性能图片处理库。
pnpm add sharp
import sharp from "sharp";
// 调整大小 + 转 WebP
await sharp("input.jpg")
.resize(800, 600, { fit: "cover" })
.webp({ quality: 80 })
.toFile("output.webp");
// 批量处理
import { readdir } from "fs/promises";
const files = await readdir("./images");
for (const file of files.filter((f) => f.endsWith(".png"))) {
await sharp(`./images/${file}`)
.resize(1200)
.webp({ quality: 85 })
.toFile(`./output/${file.replace(".png", ".webp")}`);
}
// 获取图片信息
const info = await sharp("input.jpg").metadata();
console.log(info.width, info.height, info.format);
图片压缩工具
在线工具
| 工具 | 说明 |
|---|---|
| TinyPNG | PNG/JPEG 压缩 |
| Squoosh | Google 出品,多格式 |
| SVGOMG | SVG 优化 |
命令行
# pngquant(PNG 压缩)
scoop install pngquant
pngquant --quality=65-80 --output output.png input.png
# oxipng(PNG 无损优化)
scoop install oxipng
oxipng -o 4 input.png
# cwebp(WebP 转换)
scoop install libwebp
cwebp -q 80 input.png -o output.webp
FFmpeg 视频处理补充
# 提取音频
ffmpeg -i video.mp4 -vn -acodec libmp3lame audio.mp3
# 视频转 GIF
ffmpeg -i video.mp4 -vf "fps=15,scale=480:-1" -loop 0 output.gif
# 高质量 GIF(两步法)
ffmpeg -i video.mp4 -vf "fps=15,scale=480:-1:flags=lanczos,palettegen" palette.png
ffmpeg -i video.mp4 -i palette.png -lavfi "fps=15,scale=480:-1:flags=lanczos[x];[x][1:v]paletteuse" output.gif
# 截取片段
ffmpeg -i input.mp4 -ss 00:01:00 -t 00:00:30 -c copy clip.mp4
# 合并视频
# 先创建 list.txt:
# file 'part1.mp4'
# file 'part2.mp4'
ffmpeg -f concat -safe 0 -i list.txt -c copy merged.mp4
# 添加字幕
ffmpeg -i input.mp4 -vf subtitles=sub.srt output.mp4
推荐使用顺序
常见工作流通常是:
- 先确认素材格式、尺寸和用途
- 图片批处理优先用
ImageMagick或Sharp - 视频抽轨、裁剪、转码优先用
FFmpeg - 最后再做压缩和格式分发
如果是网站资源优化,优先考虑:
- 图片转
webp/avif - SVG 做无损清理
- 视频保留兼容性优先的输出格式
工具怎么选
什么时候用 ImageMagick
- 临时命令行处理
- 批量转格式
- 水印、拼接、缩略图
什么时候用 Sharp
- 在 Node.js 项目里做服务端图片处理
- 上传后自动生成多尺寸图片
- 静态站和 CMS 的图片管线
什么时候直接去 FFmpeg
- GIF、视频片段、字幕、音轨
- 视频截图、抽音频、拼接、转码
常见问题
压缩后看起来糊了
通常是质量参数或尺寸策略过激。建议先明确:
- 是要缩尺寸,还是缩质量
- 是否要保透明通道
- 网站预览图和原图是否应该分开处理
想批量处理,但命令越来越难维护
当命令开始稳定重复时,建议:
- Shell / PowerShell 封装成脚本
- Node.js 场景改为
Sharp批处理脚本 - 视频批量任务写成固定模板命令
延伸阅读
参考链接
- ImageMagick — 官网
- Sharp — Node.js 图片处理
- Squoosh — 在线压缩
- FFmpeg Wiki — 使用指南