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

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)