强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

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 和网络资源

扩展阅读

  1. GraphicsMagick convert 完整参考
  2. GraphicsMagick identify 完整参考
  3. GraphicsMagick mogrify 完整参考
  4. Image Geometry 语法详解
  5. 常用图像处理命令技巧集

上一章第02章 安装与配置 下一章第04章 几何变换