ImageMagick 格式转换与压缩
用 ImageMagick 转换图片格式并正确压缩。JPEG、PNG、WebP、AVIF 各自该加什么参数,以及透明 PNG 转 JPEG 变黑的解决办法。
ImageMagick 是根据文件扩展名决定用哪个编码器的,不是靠参数。把输出命名为 photo.webp 才是真正选中 WebP。其余的参数都是在告诉这个编码器该下多大力气。
为网页优化 JPEG
magick input.jpg -strip -interlace Plane -sampling-factor 4:2:0 -quality 82 output.jpg
-strip删除 EXIF、注释和色彩描述文件。-interlace Plane改成渐进式,加载时先模糊后清晰,而不是从上往下一行行出来。-sampling-factor 4:2:0把色度分辨率减半。照片上完全看不出,但会让彩色细字和细红线发糊 —— 处理截图和 UI 稿时请关掉。-quality 82是常见的甜点值。低于 75 左右,皮肤和天空上的瑕疵就开始可见了。
透明 PNG 转 JPEG 而不变黑
ImageMagick 最常被吐槽的一个坑。JPEG 没有透明通道,透明像素被丢弃后,底下存的 RGB 值就露出来了 —— 通常是黑色。
magick input.png -background white -alpha remove -alpha off output.jpg
-alpha remove 先把图合成到背景色上,-alpha off 再丢掉已经多余的通道让文件更小。-background 必须写在这两者前面,因为它是设置类参数而不是操作类。
转成 WebP
magick input.jpg -quality 80 -define webp:method=6 output.webp
method=6 是最慢、体积最小的档位。在照片上,WebP q80 的体积大约相当于 JPEG q65,但观感相当。纯色图形建议用无损:
magick input.png -define webp:lossless=true output.webp
压小 PNG
magick input.png -strip -define png:compression-level=9 output.png
这是无损的。对 logo、截图、插画想要更大幅度的压缩,可以量化到调色板:
magick input.png -strip -colors 256 -define png:compression-level=9 output.png
先确认你的版本支持这个格式
格式支持是编译进去的,不是靠参数打开的。调试 AVIF 或 HEIC 命令之前,先看你的程序能不能写:
magick -list format | grep -iE 'avif|heic|webp'
每行末尾是读/写/多图三个权限位。如果显示 r--,说明只能读不能写,加任何参数都改变不了 —— 需要换一个带对应库的版本。
关于 -strip 的一个警告
-strip 同时会删掉 ICC 色彩描述文件。对广色域相机或 Display-P3 屏幕手机拍的图,不先转换像素就丢掉描述文件,颜色会明显变化 —— 通常是发闷发灰。安全的顺序是:
magick input.jpg -colorspace sRGB -strip -quality 85 output.jpg