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

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 去除隐私数据

扩展阅读

  1. GraphicsMagick 格式支持
  2. WebP 格式官方文档
  3. HEIF 格式规范
  4. EXIF 标准详解
  5. JPEG 压缩算法

上一章:第08章 批量处理 下一章:第10章 编程接口 (API)