GraphicsMagick 图像处理完整教程 / 第03章 基本操作
第03章 基本操作
3.1 命令行结构
GraphicsMagick 的所有操作通过 gm 统一入口调用:
gm <子命令> [选项...] 输入文件 [输出文件]
核心子命令速览
| 子命令 | 用途 | 示例 |
|---|---|---|
convert | 格式转换、变换、合成 | gm convert a.png b.jpg |
identify | 查看图像信息 | gm identify photo.jpg |
mogrify | 原地修改(覆盖原文件) | gm mogrify -resize 50% *.jpg |
display | 图形窗口显示 | gm display photo.jpg |
montage | 图像拼接 | gm montage a.jpg b.jpg out.png |
composite | 两幅图像合成 | gm composite overlay.png base.jpg out.jpg |
import | 屏幕截图 | gm import screenshot.png |
conjure | 执行 MSL 脚本 | gm conjure script.msl |
3.2 identify — 查看图像信息
3.2.1 基本用法
# 查看基本图像信息
gm identify photo.jpg
# 输出: photo.jpg JPEG 1920x1080+0+0 DirectClass 8-bit 245.7Ki 0.000u 0:01
# 查看详细信息
gm identify -verbose photo.jpg
# 查看多张图像
gm identify *.jpg
# 仅输出特定属性
gm identify -format "%w x %h\n" photo.jpg
# 输出: 1920 x 1080
3.2.2 格式化输出
-format 参数支持丰富的格式化占位符:
| 占位符 | 含义 | 示例 |
|---|---|---|
%w | 宽度 | 1920 |
%h | 高度 | 1080 |
%b | 文件大小 | 245.7Ki |
%m | 格式 | JPEG |
%d | 目录 | /home/user |
%f | 文件名 | photo.jpg |
%e | 扩展名 | jpg |
%z | 色深 | 8-bit |
%r | 图像类型 | DirectClass |
%[EXIF:DateTime] | EXIF 日期 | 2024:01:15 10:30:00 |
%[EXIF:Make] | 相机品牌 | Canon |
%n | 帧数 | 1 |
%Q | JPEG 质量 | 85 |
%P | 页面尺寸 | 1920x1080+0+0 |
3.2.3 业务场景:批量提取图片尺寸
#!/bin/bash
# 批量获取目录下所有图片的尺寸,输出 CSV 格式
echo "文件名,格式,宽度,高度,大小" > image_report.csv
for img in *.jpg *.png *.webp; do
[ -f "$img" ] || continue
info=$(gm identify -format "%f,%m,%w,%h,%b" "$img")
echo "$info" >> image_report.csv
done
cat image_report.csv
输出示例:
文件名,格式,宽度,高度,大小
photo1.jpg,JPEG,1920,1080,245.7Ki
photo2.png,PNG,800,600,128.3Ki
icon.webp,WebP,128,128,4.2Ki
3.3 convert — 格式转换与变换
convert 是最常用的子命令,几乎所有的图像处理操作都通过它完成。
3.3.1 基本格式转换
# PNG 转 JPEG
gm convert input.png output.jpg
# JPEG 转 PNG
gm convert input.jpg output.png
# 指定 JPEG 质量
gm convert -quality 85 input.png output.jpg
# 更高质量(文件更大)
gm convert -quality 95 input.png output.jpg
# 更低质量(文件更小)
gm convert -quality 60 input.png output.jpg
3.3.2 质量与文件大小关系
| 质量值 | 质量等级 | 典型压缩比 | 适用场景 |
|---|---|---|---|
| 95-100 | 极高 | 1:2~1:4 | 印刷、存档 |
| 85-94 | 高 | 1:4~1:8 | Web 主图、展示 |
| 70-84 | 中等 | 1:8~1:15 | Web 缩略图、博客 |
| 50-69 | 较低 | 1:15~1:30 | 预览图、快速加载 |
| 10-49 | 低 | 1:30~1:100 | 极限压缩、占位图 |
3.3.3 图像信息查看
# 查看转换前后文件信息
gm identify input.png
gm identify -verbose output.jpg | grep -E "Geometry|Quality|Type|Depth"
3.4 常用基础操作
3.4.1 缩放
# 按百分比缩放
gm convert -resize 50% input.jpg output.jpg
# 指定宽度,高度按比例
gm convert -resize 800 input.jpg output.jpg
# 指定宽高(可能变形)
gm convert -resize 800x600 input.jpg output.jpg
# 指定宽高,保持比例(填充不足部分)
gm convert -resize 800x600! input.jpg output.jpg
# 限制最大尺寸,保持比例
gm convert -resize "800x600>" input.jpg output.jpg
# 限制最小尺寸,保持比例
gm convert -resize "800x600<" input.jpg output.jpg
3.4.2 裁剪
# 从左上角裁剪指定大小
gm convert -crop 400x300+0+0 input.jpg output.jpg
# 从中心裁剪
gm convert -gravity center -crop 400x300+0+0 input.jpg output.jpg
# 自动裁剪空白区域
gm convert -trim input.jpg output.jpg
3.4.3 旋转
# 顺时针旋转 90 度
gm convert -rotate 90 input.jpg output.jpg
# 旋转 180 度
gm convert -rotate 180 input.jpg output.jpg
# 自由角度旋转
gm convert -rotate 45 input.jpg output.jpg
# 自动旋转(根据 EXIF 方向标记)
gm convert -auto-orient input.jpg output.jpg
3.4.4 翻转
# 垂直翻转(上下颠倒)
gm convert -flip input.jpg output.jpg
# 水平翻转(镜像)
gm convert -flop input.jpg output.jpg
3.5 mogrify — 原地修改
mogrify 直接修改原始文件(覆盖),适合批量处理:
# ⚠️ 注意:mogrify 会直接覆盖原文件!
# 建议先备份
# 批量转换为 JPEG
cp -r images/ images_backup/
gm mogrify -format jpg images/*.png
# 批量缩放
gm mogrify -resize 800x600 images/*.jpg
# 批量设置质量
gm mogrify -quality 80 -format jpg images/*.png
# 在输出目录中处理(不覆盖原文件)
mkdir -p output/
gm mogrify -path output/ -resize 800x600 input/*.jpg
⚠️ 重要提醒:mogrify 会直接修改原始文件,操作前务必保留备份!
mogrify vs convert
| 特性 | mogrify | convert |
|---|---|---|
| 操作对象 | 批量处理多个文件 | 单个或少量文件 |
| 输出方式 | 覆盖原文件 | 输出到新文件 |
| 输出目录 | 支持 -path 参数 | 直接指定输出路径 |
| 合成操作 | ❌ | ✅ |
| 安全性 | ⚠️ 覆盖原文件 | ✅ 原文件不变 |
3.6 display — 图像显示
# 在 X11 窗口中显示图像
gm display photo.jpg
# 显示图像信息叠加
gm display -verbose photo.jpg
# 连续显示多张
gm display *.jpg
⚠️ 注意:display 需要 X11 图形环境(Linux 桌面、macOS XQuark、Windows X Server)。服务器环境通常不可用。
3.7 montage — 图像拼接
# 水平拼接两张图
gm montage a.jpg b.jpg +append output.jpg
# 垂直拼接
gm montage a.jpg b.jpg -append output.jpg
# 创建带标注的缩略图网格
gm montage -label '%f' -tile 3x3 \
-geometry 200x200+5+5 \
*.jpg grid.jpg
# 自定义背景色和边框
gm montage -background '#333333' -border 2 \
-bordercolor white -geometry 200x200+10+10 \
*.jpg album.jpg
montage 常用参数
| 参数 | 说明 | 示例 |
|---|---|---|
-tile NxM | 列×行排列 | -tile 3x3 |
-geometry WxH+X+Y | 每个子图尺寸和间距 | -geometry 200x200+5+5 |
-label '%f' | 标注文件名 | -label '%f' |
-background | 背景色 | -background '#222' |
-border W | 边框宽度 | -border 2 |
-bordercolor | 边框颜色 | -bordercolor white |
+/-append | 垂直/水平拼接 | +append |
3.8 composite — 图像合成
# 叠加两张图
gm composite overlay.png base.jpg output.jpg
# 水印叠加
gm composite -dissolve 30 \
-gravity southeast \
watermark.png photo.jpg output.jpg
# 指定位置叠加
gm composite -geometry +100+50 \
small.png large.jpg output.jpg
# 使用蒙版
gm composite -compose CopyOpacity \
mask.png base.jpg output.png
3.9 读取与输出技巧
3.9.1 从标准输入/输出
# 从标准输入读取
cat input.jpg | gm convert -resize 50% - output.jpg
# 输出到标准输出
gm convert -resize 50% input.jpg - > output.jpg
# 管道处理
curl -s "https://example.com/photo.jpg" | \
gm convert -resize 800 - -quality 85 output.jpg
3.9.2 从 URL 读取
# 直接读取网络图像
gm convert -resize 800 \
"http://example.com/photo.jpg" \
local_output.jpg
3.9.3 多帧图像处理
# 读取 GIF 的第 3 帧
gm convert 'animation.gif[2]' frame3.png
# 读取 PDF 的第 1 页
gm convert 'document.pdf[0]' page1.png
# 将 GIF 拆分为单独帧
gm convert animation.gif frame_%d.png
# 合并帧为 GIF
gm convert -delay 20 frame_*.png animation.gif
3.10 综合实战案例
案例:Web 图片处理流水线
#!/bin/bash
# web_image_pipeline.sh
# 将一张高分辨率照片生成 Web 所需的多种尺寸
INPUT="$1"
BASENAME=$(basename "${INPUT%.*}")
# 检查输入
gm identify "$INPUT" || { echo "无法识别输入文件"; exit 1; }
# 定义输出尺寸
declare -A SIZES=(
["thumb"]="150x150"
["small"]="400x300"
["medium"]="800x600"
["large"]="1200x900"
["og"]="1200x630"
)
mkdir -p output/
for name in "${!SIZES[@]}"; do
size="${SIZES[$name]}"
echo "生成 ${name} (${size})..."
gm convert "$INPUT" \
-resize "${size}>" \
-gravity center \
-extent "${size}" \
-quality 85 \
-strip \
"output/${BASENAME}_${name}.jpg"
# 输出文件信息
gm identify -format " %f: %wx%h, %b\n" "output/${BASENAME}_${name}.jpg"
done
echo "处理完成!"
使用:
chmod +x web_image_pipeline.sh
./web_image_pipeline.sh photo_4000x3000.jpg
输出:
生成 medium (800x600)...
photo_4000x3000_medium.jpg: 800x600, 52.1Ki
生成 large (1200x900)...
photo_4000x3000_large.jpg: 1200x900, 98.4Ki
生成 small (400x300)...
photo_4000x3000_small.jpg: 400x300, 18.6Ki
生成 thumb (150x150)...
photo_4000x3000_thumb.jpg: 150x150, 5.2Ki
生成 og (1200x630)...
photo_4000x3000_og.jpg: 1200x630, 85.7Ki
处理完成!
3.11 常用参数速查表
| 参数 | 说明 | 示例 |
|---|---|---|
-resize | 缩放 | -resize 800x600 |
-crop | 裁剪 | -crop 400x300+10+20 |
-rotate | 旋转 | -rotate 90 |
-flip | 垂直翻转 | -flip |
-flop | 水平翻转 | -flop |
-quality | 输出质量 | -quality 85 |
-strip | 去除元数据 | -strip |
-verbose | 详细输出 | -verbose |
-format | 指定输出格式 | -format png |
-density | DPI 设置 | -density 300 |
-depth | 色深 | -depth 8 |
-colorspace | 色彩空间 | -colorspace sRGB |
-compress | 压缩方式 | -compress JPEG |
-gravity | 锚点位置 | -gravity center |
-extent | 画布大小 | -extent 800x600 |
-background | 背景色 | -background white |
-border | 边框 | -border 10 |
-mattecolor | 边框颜色 | -mattecolor gray |
-page | 页面设置 | -page A4 |
-label | 标签文字 | -label 'Photo' |
-comment | 注释 | -comment 'My image' |
-delay | 帧延迟 (GIF) | -delay 20 |
-loop | 循环次数 (GIF) | -loop 0 |
-dispose | 帧处置方式 | -dispose previous |
-adjoin | 多帧合并 | -adjoin |
-coalesce | 合并动画帧 | -coalesce |
-deconstruct | 优化动画 | -deconstruct |
3.12 本章小结
| 要点 | 说明 |
|---|---|
gm convert 是核心命令 | 格式转换、变换、合成都用它 |
gm identify 查看信息 | 支持 format 化输出 |
gm mogrify 批量原地修改 | ⚠️ 会覆盖原文件,慎用 |
gm montage 拼接图像 | 支持网格布局和标注 |
gm composite 叠加合成 | 水印、蒙版、位置叠加 |
| 管道和 URL 读取 | 支持 stdin/stdout 和网络资源 |
扩展阅读
- GraphicsMagick convert 完整参考
- GraphicsMagick identify 完整参考
- GraphicsMagick mogrify 完整参考
- Image Geometry 语法详解
- 常用图像处理命令技巧集
上一章:第02章 安装与配置 下一章:第04章 几何变换