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

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
%QJPEG 质量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-941:4~1:8Web 主图、展示
70-84中等1:8~1:15Web 缩略图、博客
50-69较低1:15~1:30预览图、快速加载
10-491: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

特性mogrifyconvert
操作对象批量处理多个文件单个或少量文件
输出方式覆盖原文件输出到新文件
输出目录支持 -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
-densityDPI 设置-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章 几何变换