結論先行:PNG之所以是无损圧縮,因である它使用DEFLATEアルゴリズム——LZ77字典圧縮和Huffmanエンコード2步都是完全可逆的数学操作,解压后データ与元データ逐字节一致。PNG的圧縮フロー是:ピクセルデータ先经过过滤行预测消除相邻ピクセル间的冗長,再用DEFLATEアルゴリズム圧縮。一张3000x2000的UI截图,PNGから元17.2MB压到0.35MB,降幅97.9%,且每つピクセル值不变。以下ではPNGファイル構造和DEFLATEアルゴリズム原理2つ层面詳解。
もし画像圧縮的整体方法まだ慣れていない場合は,まず画像圧縮指南:JPG/PNG/WebP形式比較。
一、PNGファイル構造:データ怎么グループ织
PNGファイル由一系列データブロック(chunk)グループ成,每つchunk含むタイプ、长度、データ和校验四部分。理解この些chunk的作用,である理解了PNGファイル的内部構造。
| データブロック | 全称 | 機能 | 是否必需 | 典型大小 |
|---|---|---|---|---|
| 签名 | PNG Signature | 8字节ファイル标识(89 50 4E 47 0D 0A 1A 0A) | 必需 | 8字节 |
| IHDR | Image Header | 图像基本信息(宽高/色深/颜色タイプ) | 必需 | 25字节 |
| IDAT | Image Data | 圧縮后的ピクセルデータ(DEFLATEエンコード) | 必需 | 不定(主体) |
| IEND | Image End | ファイル结束标记 | 必需 | 12字节 |
| PLTE | Palette | 调色板(索引色模式) | 索引色必需 | ≤768字节 |
| tRNS | Transparency | 透明度信息 | 可选 | 不定 |
| tEXt | Text | 文本元データ(作者/描述等) | 可选 | 不定 |
| gAMA | Image Gamma | Gamma校正信息 | 可选 | 16字节 |
PNGファイル最核心的chunk是IDAT,它ストレージ的である是经过过滤行预测和DEFLATE圧縮后的ピクセルデータ。一张3000x2000的24位RGB图像,元ピクセルデータ约17.2MB(3000x2000x3字节),经过PNG圧縮后IDAT部分可能只有0.3-0.5MB。圧縮効果主な取决于图像コンテンツ的可重复性——大面积纯色圧縮率最高,噪点照片圧縮率最低。
二、DEFLATEアルゴリズム原理:LZ77+Huffman2步圧縮
PNG的核心圧縮引擎是DEFLATEアルゴリズム,它由2つステップグループ成:第一步LZ77字典圧縮消除重复序列,第二步Huffmanエンコード消除エンコード冗長。2步都是无损可逆操作,このである是PNG圧縮无损的根本原因。
| ステップ | アルゴリズム | 原理 | 消除的冗長 | 可逆性 |
|---|---|---|---|---|
| 第一步 | LZ77 | 查找重复字节序列,用(距离,长度)引用替代 | 重复序列冗長 | 完全可逆 |
| 第二步 | Huffmanエンコード | 高频データ用短码,低频データ用长码 | エンコード冗長 | 完全可逆 |
1. LZ77字典圧縮
LZ77是一種類"滑动窗口"字典圧縮アルゴリズム。它维护一つ滑动窗口(通常32KB),在窗口内查找与当前位置匹配的最长字节序列。如果找到匹配,である用一つ(距离, 长度)引用替代この段字节;如果没有匹配,である输出元字节。
举例説明:假设图像データ中有连续的白色ピクセル(RGB 255,255,255),重复1000次。LZ77会在窗口中找到このつ重复模式,第一つ三元グループ记录后,后续999つ三元グループ都替换である一つ引用"回退3字节,复制3字节,重复999次"。3000字节的元データ被圧縮成十几つ字节的引用序列,圧縮率超过99%。
| データ特征 | LZ77圧縮効果 | 典型圧縮率 | 原因 |
|---|---|---|---|
| 大面积纯色 | 极好 | 95%+ | 重复序列长,引用替代効率高 |
| 水平渐变 | 好 | 70%-85% | 渐变模式可匹配 |
| 规则纹理 | 好 | 60%-80% | 纹理重复可引用 |
| 随机噪点 | 差 | 0%-10% | 无重复序列可匹配 |
| 自然照片 | 差 | 5%-20% | ピクセル差异大,匹配少 |
2. Huffmanエンコード
LZ77输出的データ(引用和元字节混合)再经过Huffmanエンコード。Huffmanエンコード的核心思想是:発生頻度高的符号用短エンコード,频率低的用长エンコード,から而低下平均エンコード长度。
举例:如果LZ77输出中"引用标记"発生頻度占60%,元字节值255出现20%,其他值各占少量比例。Huffman会に"引用标记"分配2位エンコード,に255分配3位エンコード,に低频值分配8-12位エンコード。この样平均每つ符号的エンコード长度から固定的8位低下到3-4位,进一步圧縮约50%。
DEFLATE使用2種類Huffmanエンコード方式:固定Huffman树(预设エンコード表,速度快但圧縮率一般的)和动态Huffman树(根据实际データ频率构建最优エンコード表,圧縮率更高但需额外ストレージエンコード表)。PNG標準要求使用动态Huffmanエンコード以获得最佳圧縮効果。
三、无损圧縮机制:过滤行预测+DEFLATE
PNG的无损圧縮不仅依赖DEFLATEアルゴリズム,また有一つ重要的预処理ステップ——过滤行预测(Filter)。この一步在DEFLATE之前执行,目的是させるピクセルデータ更適したLZ77圧縮。
图像中相邻ピクセル通常有相似的值(比如蓝天区域ピクセル值接近)。过滤行预测を通じてを每つピクセル值减去其左侧或上方ピクセル值,を绝に対して值変換である差值——差值通常很小或である零,この種類データ模式更適したLZ77和Huffman圧縮。
| 过滤タイプ | 名称 | 预测公式 | 適用シナリオ |
|---|---|---|---|
| 0 | None | 不预测,元值 | 无规律的噪点データ |
| 1 | Sub | 当前值 - 左侧值 | 水平渐变图像 |
| 2 | Up | 当前值 - 上方值 | 垂直渐变图像 |
| 3 | Average | 当前值 - (左+上)/2 | 平滑过渡图像 |
| 4 | Paeth | 当前值 - Paeth预测值 | 通用(大多数图像最优) |
PNGエンコーダーに対して每一行可以独立選択过滤タイプ。SmartSlim 基于自研 Rust 圧縮引擎,会に対して每行尝试全部5種類过滤方式,選択圧縮効果最优的一種類,この比固定使用单一过滤方式能额外减小10%–20%サイズ。
完整圧縮フロー:
元ピクセル -> 过滤行预测(选最优过滤) -> LZ77字典圧縮 -> Huffmanエンコード -> IDATデータブロック
解压フロー完全逆向:
IDATデータブロック -> Huffmanデコード -> LZ77解压 -> 逆过滤また原 -> 元ピクセル
2步都是精确的数学逆运算,解压后的ピクセルデータ与元データ逐字节相同,このである是PNG无损的根本保证。
四、实测:PNG vs JPEG vs WebPサイズ比較
我たち用同一グループテスト画像比較三種類形式的圧縮効果,覆盖異なるタイプの图像コンテンツ。
| 画像タイプ | 尺寸 | 元BMP | PNG | JPEG(q80) | WebP(q80) | PNG圧縮率 |
|---|---|---|---|---|---|---|
| UI截图 | 1920x1080 | 5.93MB | 0.35MB | 0.82MB | 0.28MB | 94.1% |
| 线框图 | 2000x1500 | 8.58MB | 0.42MB | 1.15MB | 0.35MB | 95.1% |
| 自然照片 | 3000x2000 | 17.16MB | 12.50MB | 1.80MB | 1.42MB | 27.2% |
| 人像照片 | 4000x3000 | 34.33MB | 28.80MB | 3.50MB | 2.80MB | 16.1% |
| 图标集 | 1024x1024 | 3.00MB | 0.08MB | 0.45MB | 0.06MB | 97.3% |
| 扫描文档 | 2480x3508 | 24.80MB | 1.20MB | 0.85MB | 0.72MB | 95.2% |
实测データ揭示了一つ重要结论:PNG的圧縮効果高度依赖图像タイプ。に対して于UI截图、线框图、图标等含大量纯色区域的图像,PNG圧縮率高达94%–97%,远超JPEG。但に対して于自然照片、人像照片等ピクセル差异大的图像,PNG圧縮率仅16%–27%,远不如JPEG的89%–90%。
再看PNG最適化前后比較,以標準PNG和最適化PNGである例:
| 画像タイプ | 標準PNG | 最適化PNG | 最適化后降幅 | 最適化方式 |
|---|---|---|---|---|
| UI截图 | 0.42MB | 0.35MB | 16.7% | Paeth过滤+zlib最高级 |
| 线框图 | 0.52MB | 0.42MB | 19.2% | 逐行最优过滤+删元データ |
| 图标集 | 0.12MB | 0.08MB | 33.3% | 转8位索引色+最適化过滤 |
| 扫描文档 | 1.50MB | 1.20MB | 20.0% | 逐行最优过滤+删gAMA |
SmartSlim 的PNG最適化能比標準PNG再减小15%–33%サイズ,核心である是逐行最优过滤選択和zlib最高圧縮レベル的グループ合使用。
更多形式比較,を参照してください无损圧縮vs有损圧縮:核心区别和WebP vs PNG vs JPG形式比較。
五、よくある質問FAQ
Q1:PNGである什么是无损圧縮?
PNG使用DEFLATEアルゴリズム圧縮データ,该アルゴリズム由LZ77字典圧縮和Huffmanエンコード2步グループ成。LZ77を通じて查找重复字节序列并用距离+长度引用替代,Huffman用变长エンコードさせる高频データ用短码。2步都是可逆操作——解压时Huffmanデコードまた原变长码,LZ77根据引用恢复元字节,データ完全一致不丢失任何信息,因此PNG是无损圧縮。
Q2:PNG和JPEG哪つ圧縮率更高?
照片类画像JPEG圧縮率远高于PNG。一张3000x2000照片,PNG约12.5MB,JPEG品質80约1.8MB,相差7倍。因であるJPEG采用有损DCT变换破棄高频詳細,而PNG必须无损保持每つピクセル。但に対して于线框图、截图、图标等含大面积纯色的画像,PNG反而更小——一张UI截图PNG 0.3MB,JPEG品質80约0.8MB。选形式要看コンテンツタイプ。
Q3:PNG圧縮率最高能到多少?
取决于画像コンテンツ。大面积纯色或渐变的画像圧縮率可达90%以上(如UI截图から5MB压到0.3MB);噪点多的照片圧縮率通常只有10%-30%,因であるピクセル差异大、LZ77找不到重复序列。PNG使用DEFLATEアルゴリズム的理论极限约在ZIP圧縮水平,无法像JPEG那样を通じて破棄信息获得极高圧縮率。
Q4:PNG最適化和PNG圧縮有什么区别?
PNG圧縮指を元ピクセルデータ用DEFLATEエンコードであるPNG形式,是標準フロー。PNG最適化是在標準圧縮基础上进一步减小サイズ,含む:尝试5種類过滤行预测选最优、使用zlib最高圧縮レベル、削除元データchunk(如tEXt/gAMA)、を24位RGBA转である8位索引色(如果颜色≤256種類)。SmartSlim 的PNG最適化能比標準PNG再减小15%-30%サイズ。
まとめ
PNG之所以能做到无损圧縮,核心在于DEFLATEアルゴリズム的LZ77和Huffman2步都是完全可逆的数学操作,加上过滤行预测预処理向上データ可圧縮性。PNGに対してUI截图、线框图、图标等大面积纯色图像圧縮効果极佳(圧縮率94%–97%),但に対して照片类图像圧縮率有限(16%–27%),この種類シナリオ应选JPEG或WebP。
如果你需要最適化PNG画像サイズ,SmartSlim 基于 Rust 圧縮引擎提供逐行最优过滤和zlib最高レベル圧縮,比標準PNG再减小15%–33%サイズ,サポート png/jpg/jpeg/webp/bmp/tiff 等 9 種類画像形式,ローカル圧縮データ不出域。
ファイルを圧縮してみませんか?SmartSlimを試す
独自開発のRust圧縮エンジンに基づき、PDF/画像/動画/Office/OFDなど10分野40以上の形式に対応。ローカル圧縮でデータは外部に送信されません。