文件压缩完全指南:PDF/图片/视频/文档压缩原理与方法

4 阅读13分钟

文件压缩完全指南:PDF/图片/视频/文档压缩原理与方法

前言

文件压缩是日常办公和开发中最常见的需求之一。一封邮件附件超过 25MB 发不出去,一个 PDF 文件太大上传不了系统,一组高清图片占满了硬盘空间——这些场景背后都指向同一个问题:文件体积需要减小

但"压缩"这个词在不同场景下含义完全不同。用 7-Zip 打个 .zip 包是压缩,把一张 5MB 的照片缩小到 500KB 也是压缩,把一段 4K 视频转成 720p 还是压缩。它们背后的技术原理截然不同,适用场景也完全不一样。

本文将从压缩的基本原理出发,系统介绍 PDF 压缩图片压缩视频压缩OFD 压缩 以及 企业文件处理合规 五个核心主题,帮助你理解不同文件类型的压缩逻辑,选择最适合的方案。


一、文件压缩的基本原理

文件压缩的本质是用更少的数据量表达相同的信息。根据是否丢失信息,压缩分为两大类:

graph TD
    A[文件压缩] --> B[无损压缩]
    A --> C[有损压缩]
    
    B --> B1[DEFLATE<br/>ZIP/gzip]
    B --> B2[LZMA/LZMA2<br/>7z格式]
    B --> B3[PNG过滤+DEFLATE]
    
    C --> C1[DCT离散余弦变换<br/>JPEG核心]
    C --> C2[量化<br/>频率系数舍入]
    C --> C3[帧间预测<br/>H.264/H.265]
    
    B1 --> B1a[文本/代码/归档]
    B2 --> B2a[高压缩比归档]
    B3 --> B3a[无损图片]
    
    C1 --> C1a[JPEG图片]
    C2 --> C2a[MP3音频]
    C3 --> C3a[MP4视频]
    
    style B fill:#4CAF50,color:#fff
    style C fill:#FF9800,color:#fff

1.1 无损压缩

无损压缩在减小文件体积的同时,保证解压后的数据与原始数据完全一致。它的原理是消除数据中的冗余——例如一段连续重复的数据 AAAAABBBCC 可以编码为 5A3B2C,存储空间立刻减半。

常见算法包括:

  • DEFLATE:ZIP/gzip 使用的核心算法,结合 LZ77 + Huffman 编码
  • LZMA/LZMA2:7-Zip 的 .7z 格式使用,压缩率高于 DEFLATE
  • PNG 的过滤 + DEFLATE:对图像行数据做过滤后再 DEFLATE 压缩

典型应用:ZIP/7z 归档压缩、PNG 图片、FLAC 音频。无损压缩适合文本、代码、表格等不能丢失任何信息的场景。

1.2 有损压缩

有损压缩通过丢弃人眼或人耳不敏感的信息来换取更小的体积。例如一张 4000×3000 的照片,屏幕显示时只需要 1920×1080,多出的像素信息就可以安全丢弃。

常见技术包括:

  • DCT(离散余弦变换):JPEG 的核心,将图像从空间域转换到频率域,丢弃高频分量
  • 量化:将频率系数按精度舍入,精度越低体积越小、损失越大
  • 帧间预测:视频压缩(H.264/H.265)利用前后帧的相似性,只编码差异部分

典型应用:JPEG 图片、MP3 音频、MP4/H.264 视频。有损压缩适合图片、视频、音频等允许一定画质/音质损失的场景。

理解这两种压缩方式的区别,是选择压缩工具和压缩参数的基础。大多数文档压缩(如 PDF、Word)会同时使用两种方式——文本部分无损压缩,内嵌的图片和视频有损压缩。


二、归档压缩 vs 内容压缩:一个关键区别

很多开发者混淆了两种完全不同的压缩需求:

graph LR
    subgraph 归档压缩
        A1[文件A 30MB] --> R1[打包压缩]
        A2[文件B 20MB] --> R1
        A3[文件C 10MB] --> R1
        R1 --> O1[archive.zip<br/>59MB<br/>仅减少1%]
        O1 --> N1[解压后恢复<br/>各文件大小不变]
    end
    
    subgraph 内容压缩
        B1[PDF文件 50MB] --> R2[内容优化]
        R2 --> O2[compressed.pdf<br/>8MB<br/>减少84%]
        O2 --> N2[直接打开使用<br/>无需解压]
    end
    
    style R1 fill:#2196F3,color:#fff
    style R2 fill:#4CAF50,color:#fff
    style O1 fill:#FFC107
    style O2 fill:#8BC34A,color:#fff
维度归档压缩(7-Zip/WinRAR)内容压缩(专业压缩工具)
做什么把文件打包成 .zip/.7z/.rar直接减小文件本身体积
压缩对象任意文件的集合PDF、图片、视频、Office 文档
压缩方式无损(消除冗余)有损+无损混合(优化内容)
使用方式解压后才能使用压缩后直接打开使用
典型场景打包传输多个文件减小单个文件体积

简单来说:如果你的问题是"文件太大发不了邮件",你需要的是内容压缩而非归档压缩——因为对方收到 .zip 后解压出来的文件还是那么大

# 归档压缩:文件大小不变,只是打包
原文件 50MB PDF → 7z 打包 → 49MB(仅减少2%)

# 内容压缩:直接减小文件本身
原文件 50MB PDF → 内容压缩 → 8MB(减少84%)

三、PDF 压缩

PDF 是办公场景中最常见的需要压缩的文件类型。合同、报告、课件、电子发票——大量文档以 PDF 格式流转,而内嵌的高清图片、扫描件、矢量图形经常导致体积膨胀。

3.1 PDF 体积的来源

一个 PDF 文件的体积主要由以下内容决定:

  • 内嵌图片与扫描件:一张 600DPI 的扫描页单页可达 2-5MB,50 页文档轻松突破 100MB
  • 嵌入字体:一套完整的中文字体可能占用 10-20MB
  • 矢量图与冗余对象:CAD 图纸导出的矢量图、被替换但未删除的旧版图片、隐藏图层

3.2 PDF 压缩的 5 种核心技术

graph LR
    A[输入PDF] --> B[图片重采样<br/>600DPI→150DPI]
    B --> C[格式转换<br/>FlateDecode→JPEG]
    C --> D[字体子集化<br/>保留使用字符]
    D --> E[移除冗余对象<br/>清理未引用资源]
    E --> F[线性化优化<br/>支持流式加载]
    F --> G[输出PDF<br/>体积减少80-90%]
    
    style A fill:#FFC107
    style G fill:#4CAF50,color:#fff
    style B fill:#E3F2FD
    style C fill:#E3F2FD
    style D fill:#E3F2FD
    style E fill:#E3F2FD
    style F fill:#E3F2FD
# PDF 压缩技术伪代码示意
def compress_pdf(input_pdf, target_dpi=150, jpeg_quality=72):
    # 1. 图片重新采样:600DPI → 150DPI(数据量减少约90%)
    for image in input_pdf.images:
        image.resample(target_dpi)
    
    # 2. 图片格式转换:FlateDecode(PNG-like) → DCTDecode(JPEG)
    for image in input_pdf.images:
        image.convert_to_jpeg(quality=jpeg_quality)
    
    # 3. 字体子集化:只保留文档实际使用的字符
    for font in input_pdf.fonts:
        font.subset(input_pdf.used_characters)
    
    # 4. 移除冗余对象:清理未引用资源、隐藏图层、历史版本
    input_pdf.remove_redundant_objects()
    
    # 5. 线性化(Fast Web View):重组结构,支持流式加载
    input_pdf.linearize()
    
    return input_pdf.save()

实战案例:一份 80MB 的扫描版合同 PDF(60页,600DPI 彩色扫描),目标是压缩到 10MB 以内以便邮件发送:

  1. 图片重采样:600DPI → 150DPI
  2. 格式转换:FlateDecode → JPEG,质量 72%
  3. 字体子集化:启用(扫描件含 OCR 识别层)
  4. 移除冗余:清理扫描产生的重复对象和元数据
  5. 灰度处理:彩色页面转为灰度(合同文本无需彩色)

最终结果:8.2MB,压缩率约 90%,文字清晰可读。

graph TD
    subgraph 压缩前
        P1[80MB 扫描合同PDF]
        P1 --> P1a[60页 600DPI彩色扫描]
        P1 --> P1b[内嵌完整中文字体]
        P1 --> P1c[冗余扫描对象]
    end
    
    subgraph 压缩后
        Q1[8.2MB 优化后PDF]
        Q1 --> Q1a[60页 150DPI JPEG]
        Q1 --> Q1b[字体子集化]
        Q1 --> Q1c[冗余对象已清理]
    end
    
    P1 -->|压缩率90%| Q1
    
    style P1 fill:#FFC107
    style Q1 fill:#4CAF50,color:#fff

四、图片压缩

图片是文件体积膨胀的头号元凶。一张手机拍摄的照片动辄 5-10MB,一个 Word 文档嵌入十几张图就轻松突破 50MB。

4.1 主流图片格式对比

格式压缩类型支持透明适用场景特点
JPEG有损不支持照片、渐变图像压缩率高,体积小
PNG无损支持图标、截图、透明图保留全部细节,体积较大
WebP有损/无损支持网页图片比 JPEG 小 25-35%
TIFF无损/无压缩支持印刷、专业摄影体积最大,质量最高
BMP无压缩不支持极少使用体积巨大,不推荐

一个简单的判断原则:照片用 JPG,图标截图用 PNG,网页图片用 WebP。更详细的决策流程如下:

graph TD
    A[选择图片格式] --> B{是否需要透明通道?}
    B -->|是| C{是否需要无损?}
    B -->|否| D{用途是什么?}
    
    C -->|是| E[PNG<br/>图标/截图/UI元素]
    C -->|否| F[WebP<br/>网页透明图]
    
    D -->|照片/渐变| G{是否用于网页?}
    D -->|线稿/文字| H[PNG<br/>避免JPEG伪影]
    
    G -->|是| I[WebP<br/>体积最小]
    G -->|否| J[JPEG<br/>兼容性最好]
    
    style E fill:#4CAF50,color:#fff
    style F fill:#2196F3,color:#fff
    style I fill:#2196F3,color:#fff
    style J fill:#FF9800,color:#fff
    style H fill:#4CAF50,color:#fff

4.2 核心参数:分辨率与质量因子

# 图片压缩关键参数示例
from PIL import Image

img = Image.open("photo.jpg")  # 原始 4000x3000, ~8MB

# 分辨率调整:减半 → 体积减少约75%
img_resized = img.resize((1920, 1080))

# 质量因子:95→75,肉眼几乎无差异,体积减少50%
img_resized.save("photo_compressed.jpg", quality=75)
# 结果:~500KB,总体减少约94%
graph LR
    A[原始照片<br/>4000×3000<br/>~8MB] --> B[分辨率调整<br/>1920×1080<br/>~2MB]
    B --> C[质量因子调整<br/>Q95→Q75<br/>~500KB]
    
    A --> D[总体减少: 94%]
    
    style A fill:#FFC107
    style B fill:#FF9800,color:#fff
    style C fill:#4CAF50,color:#fff
    style D fill:#2196F3,color:#fff
  • 分辨率:4000×3000 缩小到 1920×1080,体积减少 75% 以上
  • 质量因子:JPEG 质量从 95 降到 75,肉眼几乎看不出差异,但体积减少 50%
  • 最佳平衡点:JPEG 质量 75 左右,对大多数场景都足够

五、视频压缩

视频是所有文件类型中体积最大的。一段 1 分钟的 4K 视频可能超过 400MB,一段 1080p 的屏幕录制也可能有 100MB 以上。

5.1 编码格式对比

编码格式压缩效率兼容性编码速度适用场景
H.264 (AVC)基准极好(几乎所有设备)通用场景、邮件、移动设备
H.265 (HEVC)比 H.264 节省 40-50%较好(部分旧设备不支持)中等存储归档、高清视频
VP9接近 H.265较好(Web 平台为主)中等网页视频、YouTube
AV1比 H.265 再省 20-30%发展中未来标准、流媒体
graph LR
    subgraph 压缩效率递增
        H264[H.264<br/>基准 100%] --> H265[H.265<br/>节省40-50%]
        H265 --> VP9[VP9<br/>接近H.265]
        VP9 --> AV1[AV1<br/>再省20-30%]
    end
    
    subgraph 兼容性递减
        C1[H.264: 几乎所有设备] --> C2[H.265: 大部分设备]
        C2 --> C3[VP9: Web平台为主]
        C3 --> C4[AV1: 发展中]
    end
    
    style H264 fill:#4CAF50,color:#fff
    style AV1 fill:#FF9800,color:#fff

5.2 码率控制策略

# FFmpeg 视频压缩示例

# 邮件发送:H.264 + 720p + CRF 28(1分钟视频约5-10MB)
ffmpeg -i input.mp4 -c:v libx264 -crf 28 -preset medium \
  -vf scale=1280:720 -r 30 -c:a aac -b:a 128k output_email.mp4

# 网页发布:H.264 + 1080p + CRF 26
ffmpeg -i input.mp4 -c:v libx264 -crf 26 -preset medium \
  -vf scale=1920:1080 -r 30 -c:a aac -b:a 192k output_web.mp4

# 存储归档:H.265 + 原始分辨率 + CRF 20
ffmpeg -i input.mp4 -c:v libx265 -crf 20 -preset medium \
  -c:a aac -b:a 192k output_archive.mp4

三种码率控制模式的区别:

  • CRF(恒定速率因子):画质恒定,码率随画面复杂度自动变化,最推荐
  • CBR(恒定码率):码率不变,适合直播等实时流媒体
  • VBR(可变码率):在指定范围内动态调整,适合精确控制目标体积
graph TD
    A[视频码率控制] --> B[CRF 恒定速率因子]
    A --> C[CBR 恒定码率]
    A --> D[VBR 可变码率]
    
    B --> B1[画质恒定]
    B --> B2[码率随复杂度变化]
    B --> B3[推荐用于: 通用压缩]
    B --> B4[典型值: 20-28]
    
    C --> C1[码率不变]
    C --> C2[简单画面浪费带宽]
    C --> C3[推荐用于: 直播/实时流]
    
    D --> D1[码率在范围内波动]
    D --> D2[精确控制目标体积]
    D --> D3[推荐用于: 存储限制场景]
    
    style B fill:#4CAF50,color:#fff
    style C fill:#FF9800,color:#fff
    style D fill:#2196F3,color:#fff

六、OFD 压缩

OFD(开放固定版式文档)是中国国家标准 GB/T 33190-2016 定义的版式文档格式,在政府机关和事业单位的电子公文系统中广泛使用。

6.1 OFD vs PDF 核心区别

维度OFDPDF
格式标准中国国家标准 GB/T 33190-2016ISO 32000 国际标准
文件结构XML + ZIP 容器,结构开放二进制/文本混合,结构相对封闭
使用场景政务公文、电子证照、招投标通用文档、合同、报告
签章支持原生支持电子签章,符合国密标准支持数字签名,国密需额外适配

6.2 OFD 压缩方法

OFD 文件本质上是 ZIP 压缩包,内部用 XML 描述页面、文字、图片等元素。压缩方法与 PDF 类似:

  • 图片重采样:将高分辨率图片降至合理分辨率(300dpi → 150dpi)
  • 字体子集化:只保留文档中实际使用的字符字形
  • 清理冗余对象:移除未引用的资源和重复对象
  • 图片格式优化:将未压缩位图转为 JPEG

一个 50MB 的 OFD 扫描公文,经过合理处理后通常可压缩到 8-12MB。

graph TD
    A[OFD文件结构] --> B[ZIP容器层]
    A --> C[XML描述层]
    A --> D[资源层]
    
    B --> B1[Doc_0/ 文档目录]
    B --> B2[Pages/ 页面目录]
    B --> B3[Res/ 资源目录]
    
    C --> C1[Document.xml 文档描述]
    C --> C2[Page_N.xml 页面描述]
    C --> C3[Signs/ 签章信息]
    
    D --> D1[图片资源]
    D --> D2[字体资源]
    D --> D3[颜色空间]
    
    E[压缩优化] --> E1[图片重采样]
    E --> E2[字体子集化]
    E --> E3[清理未引用资源]
    E --> E4[位图转JPEG]
    
    style A fill:#2196F3,color:#fff
    style E fill:#4CAF50,color:#fff

七、本地压缩 vs 在线压缩:安全性考量

7.1 两种模式的本质差异

graph LR
    subgraph 本地压缩
        L1[用户设备] --> L2[本地压缩引擎]
        L2 --> L3[压缩后文件]
        L4[文件全程不离开设备]
    end
    
    subgraph 在线压缩
        O1[用户设备] -->|上传文件| O2[第三方服务器]
        O2 --> O3[服务器端压缩]
        O3 -->|下载结果| O4[用户设备]
        O5[文件经过网络传输<br/>存在留存风险]
    end
    
    style L2 fill:#4CAF50,color:#fff
    style O2 fill:#FFC107
    style L4 fill:#E8F5E9
    style O5 fill:#FFF3E0
维度本地压缩在线压缩
数据位置全程留在本地设备上传至第三方服务器
数据出境不涉及可能构成数据出境
第三方风险存在泄露和留存风险
日志可控企业可记录处理行为操作不在企业日志范围
网络依赖无需联网必须联网

7.2 合规风险

随着《数据安全法》和《个人信息保护法》的实施,企业在选择文件处理工具时必须考虑:

  • 数据出境风险:使用境外在线工具处理敏感文件可能触发法定申报义务
  • 第三方处理风险:即使服务商承诺删除,传输链路和备份机制仍可能留下痕迹
  • 日志留存风险:数据安全法要求数据处理日志留存不少于六个月,员工用个人在线工具处理企业文件形成合规盲区

核心原则:数据分级、本地优先、日志可溯


八、如何选择压缩工具

选择压缩工具时,建议从以下维度评估:

维度关键问题
压缩能力能否处理 PDF、图片、视频、Office 文档等多种格式?
压缩效果同等画质下压缩率如何?是否支持多档压缩级别?
数据安全文件是否需要上传?本地处理还是云端处理?
批量处理能否同时压缩多个文件?是否支持队列管理?
平台支持是否支持 Windows、macOS、Linux?是否支持 Apple Silicon?
资源占用压缩时是否影响其他程序运行?CPU/内存占用是否可控?
使用成本免费版限制多少?付费版定价是否合理?

九、常见问题(FAQ)

Q1:文件压缩后画质会下降吗?

取决于压缩方式。无损压缩不会降低画质,但有损压缩会牺牲部分细节换取更小体积。选择合适的压缩级别可以在体积和画质之间取得平衡。一般来说,PDF 压缩到 150dpi 对屏幕阅读完全够用,肉眼几乎感知不到差异。

Q2:7-Zip 打包和专业内容压缩工具有什么区别?

7-Zip 是归档压缩工具,将文件打包成 .7z/.zip 压缩包,解压后恢复原文件,体积不变;专业内容压缩工具直接减小 PDF、图片、视频等文件本身的体积,压缩后的文件无需解压即可直接打开使用。两者的应用场景不同——前者用于打包传输,后者用于减小单个文件体积。

Q3:PDF 压缩后文件反而变大了怎么办?

这通常发生在原本已经高度压缩的 PDF 上。如果内部图片已是低分辨率 JPEG,再压缩时重编码可能引入额外开销。建议优先使用移除冗余对象字体子集化等无损操作,避免对已压缩图片重复有损压缩。

Q4:有没有不联网就能压缩 PDF 的方法?

有。本地压缩软件可以完全离线运行,文件不经过网络传输。开源方案如 Ghostscript、PyMuPDF 等可以通过命令行或编程方式实现本地 PDF 压缩,适合处理涉密或隐私文档。商业软件通常提供更友好的界面和多格式支持。

Q5:JPEG 质量因子设为多少最合适?

一般来说,JPEG 质量 75 是体积和画质的最佳平衡点。75 以上肉眼几乎无法分辨差异,75 以下开始出现明显的块状伪影。对于需要极致压缩的场景(如邮件附件),可以降到 60;对于需要高质量保留的场景(如摄影作品),建议 90 以上。


总结

文件压缩不是一项复杂的技术,但选择正确的方法可以事半功倍。核心原则是:

  1. 明确压缩目的:邮件发送 / 网页发布 / 存储归档,不同场景参数不同
  2. 选择合适的压缩方式:有损 vs 无损,归档压缩 vs 内容压缩
  3. 重视数据安全:处理敏感文件时优先选择本地压缩,避免合规风险

关键数据速查:

文件类型推荐参数预期压缩率
PDF 扫描件600DPI → 150DPI + JPEG Q7280-90%
照片图片分辨率减半 + JPEG Q7575-94%
视频邮件H.264 + 720p + CRF 2890-95%
视频网页H.264 + 1080p + CRF 2680-90%
视频归档H.265 + 原分辨率 + CRF 2050-70%
OFD 公文图片重采样 + 字体子集化75-85%

本文为原创技术文章,欢迎转载,转载请注明出处。