GraphicsMagick 图像处理完整教程 / 第09章 图像格式详解
第09章 图像格式详解
9.1 格式总览
GraphicsMagick 支持 88+ 种图像格式。以下是最常用的格式对比:
| 格式 | 全称 | 透明 | 动图 | 有损压缩 | 无损压缩 | 典型用途 |
|---|
| JPEG | Joint Photographic Experts Group | ❌ | ❌ | ✅ | ❌ | 照片、Web 主图 |
| PNG | Portable Network Graphics | ✅ | ❌ | ❌ | ✅ | 图标、截图、透明图 |
| WebP | Web Picture | ✅ | ✅ | ✅ | ✅ | Web 现代格式 |
| GIF | Graphics Interchange Format | ✅ | ✅ | ✅ (256色) | ❌ | 动图、图标 |
| TIFF | Tagged Image File Format | ✅ | ❌ | ✅ | ✅ | 印刷、存档 |
| BMP | Bitmap | ✅ | ❌ | ❌ | ✅ | Windows 原始格式 |
| HEIF | High Efficiency Image Format | ✅ | ✅ | ✅ | ✅ | 移动设备 |
| AV1 Image (AVIF) | AV1 Image File Format | ✅ | ✅ | ✅ | ✅ | 下一代 Web |
| JPEG 2000 | — | ✅ | ❌ | ✅ | ✅ | 医学影像 |
| PDF | Portable Document Format | — | — | — | — | 文档 |
| SVG | Scalable Vector Graphics | ✅ | ✅ | — | — | 矢量图形 |
| RAW | 相机原始格式 | ❌ | ❌ | ❌ | ✅ | 专业摄影 |
9.2 JPEG
9.2.1 JPEG 特点
| 特性 | 说明 |
|---|
| 色彩支持 | 24 位真彩色 (16M 色) |
| 压缩方式 | 有损压缩 (DCT) |
| 透明度 | ❌ 不支持 |
| 动画 | ❌ 不支持 |
| 最佳用途 | 照片、渐变色图像 |
| 不适合 | 截图、图标、文字、线条画 |
9.2.2 JPEG 操作
# 基本转换
gm convert input.png output.jpg
# 设置质量
gm convert -quality 95 input.png high_quality.jpg # 高质量
gm convert -quality 60 input.png low_quality.jpg # 低质量(小文件)
# 渐进式 JPEG(Progressive JPEG)
gm convert -interlace Plane input.png progressive.jpg
# 去除 EXIF 元数据
gm convert -strip input.jpg output_stripped.jpg
# 限制文件大小(近似)
gm convert -define jpeg:extent=100KB input.jpg output_100k.jpg
# 色度子采样
gm convert -sampling-factor 4:4:4 input.jpg output_444.jpg # 无子采样
gm convert -sampling-factor 4:2:0 input.jpg output_420.jpg # 默认
9.2.3 JPEG 质量与文件大小
| 质量 | 视觉效果 | 压缩比 | 典型文件 (4000×3000) |
|---|
| 100 | 几乎无损 | 1:2 | ~18MB |
| 95 | 极高 | 1:4 | ~9MB |
| 85 | 高(推荐 Web) | 1:8 | ~4.5MB |
| 75 | 中高 | 1:12 | ~3MB |
| 60 | 中等 | 1:20 | ~1.8MB |
| 40 | 较低 | 1:40 | ~900KB |
| 20 | 低(明显失真) | 1:80 | ~450KB |
9.2.4 渐进式 JPEG 详解
# 渐进式 JPEG vs 基线 JPEG
# 渐进式:从模糊到清晰逐步加载(网络友好)
# 基线:从上到下逐行加载
# 生成渐进式 JPEG
gm convert -interlace Plane input.jpg progressive.jpg
# 验证是否为渐进式
gm identify -verbose progressive.jpg | grep "Interlace"
# 输出: Interlace: Plane (渐进式)
# 输出: Interlace: None (基线)
9.3 PNG
9.3.1 PNG 特点
| 特性 | 说明 |
|---|
| 色彩支持 | 最高 48 位真彩色 + 16 位透明度 |
| 压缩方式 | 无损压缩 (DEFLATE) |
| 透明度 | ✅ 支持(Alpha 通道) |
| 动画 | ❌ (PNG 格式本身不支持) |
| 最佳用途 | 图标、截图、文字、透明图、需要无损的场景 |
| 不适合 | 照片(文件太大) |
9.3.2 PNG 操作
# 基本转换
gm convert input.jpg output.png
# 控制压缩级别 (0-9)
gm convert -quality 0 input.png uncompressed.png # 无压缩
gm convert -quality 9 input.png compressed.png # 最高压缩
# 去除 Alpha 通道
gm convert -opaque-color white transparent.png opaque.jpg
# 保留透明度
gm convert -transparent-color white input.jpg transparent.png
# PNG 优化
gm convert input.png -strip -quality 9 optimized.png
# 8 位调色板 PNG(小文件)
gm convert -colors 256 -type Palette input.png palette.png
9.3.3 PNG 压缩级别对比
| 级别 | 压缩速度 | 文件大小 | 适用场景 |
|---|
| 0 | 最快 | 最大 | 调试 |
| 1-3 | 快 | 较大 | 实时处理 |
| 6 | 中等 | 中等 | 默认 |
| 9 | 最慢 | 最小 | 存档、发布 |
9.3.4 透明度处理
# 将白色背景转为透明
gm convert -fuzz 5% -transparent white input.jpg output.png
# 将特定颜色转为透明
gm convert -fuzz 10% -transparent '#FF00FF' input.jpg output.png
# 创建半透明图像
gm convert input.png -channel A -evaluate Set 50% output_semi.png
# 提取 Alpha 通道
gm convert input.png -channel A -separate alpha_mask.png
9.4 WebP
9.4.1 WebP 特点
| 特性 | 说明 |
|---|
| 色彩支持 | 32 位 (RGB + Alpha) |
| 压缩方式 | 有损 (VP8) / 无损 |
| 透明度 | ✅ 支持 |
| 动画 | ✅ 支持 |
| 压缩率 | 比 JPEG 小 25-34% |
| 浏览器支持 | Chrome、Firefox、Edge、Safari (14+) |
| 最佳用途 | Web 图片、移动应用 |
9.4.2 WebP 操作
# JPEG → WebP
gm convert -quality 85 input.jpg output.webp
# PNG → WebP(保留透明度)
gm convert -quality 90 input.png output.webp
# WebP → JPEG
gm convert input.webp output.jpg
# 有损 WebP
gm convert -quality 75 input.jpg lossy.webp
# 无损 WebP
gm convert -define webp:lossless=true input.png lossless.webp
9.4.3 WebP 与 JPEG/PNG 对比
| 对比维度 | JPEG | PNG | WebP (有损) | WebP (无损) |
|---|
| 照片文件大小 | 100% (基准) | 300% | 65-75% | 200% |
| 透明度 | ❌ | ✅ | ✅ | ✅ |
| 动画 | ❌ | ❌ | ✅ | ✅ |
| 浏览器支持 | 100% | 100% | 96% | 96% |
| 编码速度 | 快 | 中 | 较慢 | 慢 |
9.5 TIFF
9.5.1 TIFF 特点
| 特性 | 说明 |
|---|
| 色彩支持 | 最高 48 位 |
| 压缩方式 | 多种(LZW、ZIP、JPEG、PackBits、无压缩) |
| 透明度 | ✅ 支持 |
| 多页 | ✅ 支持 |
| 元数据 | 丰富的 TIFF 标签 |
| 最佳用途 | 印刷、存档、医学影像、扫描 |
9.5.2 TIFF 操作
# 基本转换
gm convert input.jpg output.tiff
# 使用 LZW 无损压缩
gm convert -compress LZW input.jpg output_lzw.tiff
# 使用 ZIP 无损压缩
gm convert -compress Zip input.jpg output_zip.tiff
# 使用 PackBits 压缩
gm convert -compress PackBits input.jpg output_pack.tiff
# 无压缩
gm convert -compress None input.jpg output_none.tiff
# 设置 DPI(印刷用)
gm convert -density 300 -units PixelsPerInch \
input.jpg output_300dpi.tiff
# 多页 TIFF
gm convert page1.jpg page2.jpg page3.jpg multipage.tiff
9.5.3 TIFF 压缩方式对比
| 压缩方式 | 类型 | 压缩比 | 速度 | 适用场景 |
|---|
| None | 无 | 1:1 | 最快 | 原始存档 |
| LZW | 无损 | 1:2~1:4 | 快 | 通用无损 |
| ZIP | 无损 | 1:2~1:5 | 中 | 大面积纯色 |
| PackBits | 无损 | 1:1~1:3 | 最快 | 简单图案 |
| JPEG | 有损 | 1:10~1:20 | 快 | 不敏感场景 |
| Group4 | 无损 | 高 | 中 | 黑白文档 |
9.6 HEIF / HEIC
9.6.1 HEIF 特点
| 特性 | 说明 |
|---|
| 开发者 | MPEG (Moving Picture Experts Group) |
| 压缩基础 | HEVC / H.265 |
| 压缩率 | 比 JPEG 小 ~50% |
| 透明度 | ✅ |
| 动画 | ✅ |
| 主要来源 | iPhone、iPad 拍照 |
| 浏览器支持 | Safari (macOS/iOS) |
9.6.2 HEIF 操作
# 需要编译支持 libheif
# 安装: sudo apt install libheif-dev
# HEIC → JPEG
gm convert IMG_1234.heic output.jpg
# HEIC → PNG(保留质量)
gm convert IMG_1234.heic output.png
# 批量转换 iPhone 照片
for heic in *.HEIC; do
gm convert -quality 92 "$heic" "${heic%.HEIC}.jpg"
done
9.7 RAW 格式
9.7.1 RAW 特点
| 特性 | 说明 |
|---|
| 本质 | 相机传感器原始数据 |
| 色深 | 12-14 位/通道 |
| 优势 | 最大后期空间 |
| 常见格式 | CR2 (Canon)、NEF (Nikon)、ARW (Sony)、DNG (通用) |
| 处理库 | LibRaw / dcraw |
9.7.2 RAW 操作
# 需要 libraw 支持
# 安装: sudo apt install libraw-dev
# RAW → JPEG
gm convert -quality 95 DSC_0001.NEF output.jpg
# RAW → TIFF(保留最大质量)
gm convert -depth 16 DSC_0001.CR2 output.tiff
# 指定白平衡
gm convert -define dng:use-camera-wb=true DSC_0001.DNG output.jpg
# 批量转换
for raw in *.NEF *.CR2 *.ARW; do
[ -f "$raw" ] || continue
gm convert -quality 92 "$raw" "${raw%.*}.jpg"
done
9.8 EXIF 元数据处理
9.8.1 查看 EXIF 信息
# 查看完整 EXIF
gm identify -verbose photo.jpg | grep -A 50 "EXIF"
# 提取特定 EXIF 字段
gm identify -format "%[EXIF:DateTime]" photo.jpg
gm identify -format "%[EXIF:Make]" photo.jpg
gm identify -format "%[EXIF:Model]" photo.jpg
gm identify -format "%[EXIF:GPSLatitude]" photo.jpg
gm identify -format "%[EXIF:ImageWidth]x%[EXIF:ImageHeight]" photo.jpg
9.8.2 EXIF 常用字段
| 字段 | 说明 | 示例 |
|---|
DateTime | 拍摄日期 | 2024:01:15 10:30:00 |
Make | 相机品牌 | Canon |
Model | 相机型号 | EOS R5 |
ExposureTime | 曝光时间 | 1/250 |
FNumber | 光圈 | f/2.8 |
ISOSpeedRatings | ISO | 400 |
FocalLength | 焦距 | 85mm |
ImageWidth | 宽度 | 8192 |
ImageHeight | 高度 | 5464 |
Orientation | 方向 | 1 (正常) |
GPSLatitude | 纬度 | 39.9042° N |
GPSLongitude | 经度 | 116.4074° E |
Software | 处理软件 | Adobe Lightroom |
Artist | 作者 | John Doe |
Copyright | 版权 | © 2024 |
9.8.3 EXIF 操作
# 去除所有元数据
gm convert -strip input.jpg output_no_exif.jpg
# 保留元数据复制
gm convert input.jpg output_with_exif.jpg
# 去除 GPS 信息(隐私保护)
gm convert +profile "exif:GPS*" input.jpg output_no_gps.jpg
# 去除所有配置文件
gm convert +profile '*' input.jpg output_clean.jpg
9.8.4 业务场景:照片信息批量提取
#!/bin/bash
# exif_report.sh — 批量提取照片 EXIF 信息
echo "文件名,拍摄日期,相机,光圈,ISO,焦距" > exif_report.csv
for img in *.jpg *.JPG *.jpeg; do
[ -f "$img" ] || continue
DATE=$(gm identify -format "%[EXIF:DateTime]" "$img" 2>/dev/null)
MAKE=$(gm identify -format "%[EXIF:Make]" "$img" 2>/dev/null)
MODEL=$(gm identify -format "%[EXIF:Model]" "$img" 2>/dev/null)
FNUM=$(gm identify -format "%[EXIF:FNumber]" "$img" 2>/dev/null)
ISO=$(gm identify -format "%[EXIF:ISOSpeedRatings]" "$img" 2>/dev/null)
FOCAL=$(gm identify -format "%[EXIF:FocalLength]" "$img" 2>/dev/null)
echo "$img,$DATE,$MAKE $MODEL,$FNUM,$ISO,$FOCAL" >> exif_report.csv
done
echo "报告已生成: exif_report.csv"
9.9 格式选择指南
9.9.1 按用途选择
| 用途 | 推荐格式 | 理由 |
|---|
| Web 照片 | WebP > JPEG | 压缩率高 |
| Web 图标/Logo | WebP > PNG | 支持透明,文件小 |
| 截图 | PNG | 无损,文字清晰 |
| 动图 | WebP > GIF | 色彩丰富 |
| 印刷 | TIFF (300dpi) | 无损,高精度 |
| 存档 | TIFF / PNG | 无损 |
| iPhone 照片 | HEIC → JPEG/WebP | 兼容性 |
| 专业摄影 | RAW → TIFF | 最大后期空间 |
| 电子邮件附件 | JPEG (q=70) | 小文件 |
| 文档扫描 | PDF / TIFF G4 | 压缩率高 |
9.9.2 Web 图片格式决策树
需要透明?
├── 是 → WebP (首选) > PNG-8 (简单) / PNG-24 (复杂)
└── 否 → 照片?
├── 是 → WebP (首选) > JPEG (兼容性)
└── 否 → 线条/文字?
├── 是 → PNG-8/16 > WebP (无损)
└── 否 → WebP > JPEG
9.9.3 自动格式选择脚本
#!/bin/bash
# auto_format.sh — 根据图像特征自动选择最佳格式
INPUT="$1"
BASENAME=$(basename "${INPUT%.*}")
# 检测特征
INFO=$(gm identify -verbose "$INPUT" 2>/dev/null)
HAS_ALPHA=$(echo "$INFO" | grep -c "Alpha")
COLORS=$(echo "$INFO" | grep "Number Unique" | awk '{print $NF}')
# 决策逻辑
if [ "$HAS_ALPHA" -gt 0 ]; then
if [ "$COLORS" -lt 256 ]; then
FORMAT="png"
QUALITY=9
echo "→ 少色透明图 → PNG-8"
else
FORMAT="webp"
QUALITY=90
echo "→ 多色透明图 → WebP"
fi
elif [ "$COLORS" -lt 256 ]; then
FORMAT="png"
QUALITY=9
echo "→ 少色不透明 → PNG-8"
else
FORMAT="webp"
QUALITY=85
echo "→ 照片级 → WebP"
fi
gm convert "$INPUT" -quality "$QUALITY" "${BASENAME}.${FORMAT}"
echo "输出: ${BASENAME}.${FORMAT} ($(stat -c%s "${BASENAME}.${FORMAT}" 2>/dev/null || stat -f%z "${BASENAME}.${FORMAT}") bytes)"
9.10 格式操作速查表
| 操作 | 命令 |
|---|
| 查看格式支持 | gm convert -list format |
| JPEG 渐进式 | -interlace Plane |
| JPEG 质量 | -quality 85 |
| PNG 压缩 | -quality 0-9 |
| WebP 转换 | gm convert a.jpg a.webp |
| TIFF LZW | -compress LZW |
| 去元数据 | -strip |
| 去 GPS | +profile "exif:GPS*" |
| 查看 EXIF | gm identify -verbose |
| EXIF 字段 | -format "%[EXIF:Field]" |
| 多页 TIFF | gm convert a.jpg b.jpg multi.tiff |
| 透明去背景 | -fuzz N% -transparent COLOR |
9.11 本章小结
| 要点 | 说明 |
|---|
| JPEG 适合照片 | 有损压缩,质量 85 是 Web 最佳平衡 |
| PNG 适合图标/截图 | 无损,支持透明,文件较大 |
| WebP 是现代 Web 首选 | 兼具有损/无损、透明、动画 |
| TIFF 适合印刷/存档 | 无损,支持多页,DPI 可控 |
| HEIC 需要额外库 | iPhone 照片常见格式 |
| EXIF 包含拍摄信息 | -strip 去除隐私数据 |
扩展阅读
- GraphicsMagick 格式支持
- WebP 格式官方文档
- HEIF 格式规范
- EXIF 标准详解
- JPEG 压缩算法
上一章:第08章 批量处理
下一章:第10章 编程接口 (API)