全部文章

图片与视频处理

ImageMagick、Sharp、视频转码、图片压缩与格式转换

目录 17 节

图片与视频处理

这页适合作为“媒体素材处理入口”。可以把它简单理解成三类工具分工:

  • 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);

图片压缩工具

在线工具

工具说明
TinyPNGPNG/JPEG 压缩
SquooshGoogle 出品,多格式
SVGOMGSVG 优化

命令行

# 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

推荐使用顺序

常见工作流通常是:

  1. 先确认素材格式、尺寸和用途
  2. 图片批处理优先用 ImageMagickSharp
  3. 视频抽轨、裁剪、转码优先用 FFmpeg
  4. 最后再做压缩和格式分发

如果是网站资源优化,优先考虑:

  • 图片转 webp / avif
  • SVG 做无损清理
  • 视频保留兼容性优先的输出格式

工具怎么选

什么时候用 ImageMagick

  • 临时命令行处理
  • 批量转格式
  • 水印、拼接、缩略图

什么时候用 Sharp

  • 在 Node.js 项目里做服务端图片处理
  • 上传后自动生成多尺寸图片
  • 静态站和 CMS 的图片管线

什么时候直接去 FFmpeg

  • GIF、视频片段、字幕、音轨
  • 视频截图、抽音频、拼接、转码

常见问题

压缩后看起来糊了

通常是质量参数或尺寸策略过激。建议先明确:

  • 是要缩尺寸,还是缩质量
  • 是否要保透明通道
  • 网站预览图和原图是否应该分开处理

想批量处理,但命令越来越难维护

当命令开始稳定重复时,建议:

  • Shell / PowerShell 封装成脚本
  • Node.js 场景改为 Sharp 批处理脚本
  • 视频批量任务写成固定模板命令

延伸阅读

参考链接

阅读建议
  • - 先读标题和摘要,再结合目录决定从哪个章节开始精读。
  • - 看到具体命令、配置或步骤时,尽量在自己的环境里同步验证。
  • - 如果你只是快速查资料,可先看目录和相关文档,再决定是否深入全文。
适合谁看
  • - 希望把零散经验整理成长期可复用工作流的人
  • - 需要处理图像、视频、音频或创作流水线的人
  • - 希望阅读时顺手建立自己的操作清单或收藏体系的人
执行前检查
  • - 先浏览标题、摘要和目录,带着问题阅读会更高效
  • - 确认素材路径、导出格式和磁盘空间是否满足当前任务
  • - 如果页面里提到相关文档,尽量一起打开对照,效果通常更完整
同类内容
← 上一篇数据库基础速查