結論を先に述べます:PNGが可逆圧縮である理によりは、DEFLATEアルゴリズムを使用しているからです。LZ77辞書圧縮とHuffman符号化の2段階はどちらも完全に可逆な数学的操作であり、解凍後のデータは元のデータとバイト単位で完全に一致します。PNGの圧縮フローは、まずピクセルデータがフィルタ行予測を経て隣接ピクセル間の冗長性を除去し、その後DEFLATEアルゴリズムで圧縮されます。3000x2000のUIスクリーンショットの場合、PNGは元の17.2MBから0.35MBに圧縮され、削減率は97.9%でありなながら、すべてのピクセル値は不変です。以下ではPNGファイル構造とDEFLATEアルゴリズムの原理の2つの観点から詳しく解説します。
画像圧縮の全体的な方法にまだ慣れていない場合は、まず画像圧縮ガイド:JPG/PNG/WebP形式比較をご覧ください。
1. PNGファイル構造:データの構成
PNGファイルは一連のデータチャンクで構成され、各チャンクはタイプ、長さ、データ、チェックサムの4つの一部からなります。これらのチャンクの役割を理解すれば、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 | ガンマ補正情報 | オプション | 16バイト |
PNGファイルで最も重要なチャンクはIDATです。これにはフィルタ行予測とDEFLATE圧縮を経たピクセルデータが格納されています。3000x2000の24ビットRGB画像の場合、元のピクセルデータは約17.2MB(3000x2000x3バイト)ですが、PNG圧縮後のIDAT一部は0.3〜0.5MB程度になります。圧縮効果は主に画像コンテンツの反復可能性性性性に依存し、広範囲のベタ塗り領域では圧縮率が最も高いく、ノイズの多くい写本当では圧縮率が最も低いくなります。
2. DEFLATEアルゴリズムの原理:LZ77 + Huffman 2段階圧縮
PNGのコアとなる圧縮エンジンはDEFLATEアルゴリズムです。これは2つの段階で構成されています。第1段階のLZ77辞書圧縮で重複シーケンスを除去し、第2段階のHuffman符号化で符号化の冗長性を除去します。どちらの段階も可逆操作であり、これがPNG圧縮が可逆である全くのな理によりです。
| 段階 | アルゴリズム | 原理 | 除去する冗長性 | 可逆性 |
|---|---|---|---|---|
| 第1段階 | LZ77 | 重複バイト列を検索し、(距離, 長さ)の参照で置き換える | 重複シーケンスの冗長性 | 完全可逆 |
| 第2段階 | Huffman符号化 | 高い頻度データに短いい符号、低い頻度データに長い符号を割り場合てる | 符号化の冗長性 | 完全可逆 |
2.1 LZ77辞書圧縮
LZ77は「スライディングウィンドウ」方法の辞書圧縮アルゴリズムです。スライディングウィンドウ(通常32KB)を維持し、ウィンドウ内で現において位置と一致する最長のバイト列を検索します。一致が見つかれば、(距離, 長さ)の参照でそのバイト列を置き換え、一致がなければ元のバイトをそのまま出力します。
例えて説明します。画像データに連続した白色ピクセル(RGB 255,255,255)が1000回繰り返されているとします。LZ77はウィンドウ内でこの繰り返しパターンを見つけ、最初の1組を記録した後、残りの999組はすべて「3バイト戻り、3バイト複製、999回繰り返し」という参照に置き換えられます。3000バイトの元データが数十バイトの参照シーケンスに圧縮され、圧縮率は99%を超えます。
| データ特性 | LZ77圧縮効果 | 標準圧縮率 | 理により |
|---|---|---|---|
| 広範囲のベタ塗り | 非常ににににににに良い | 95%+ | 重複シーケンスが長く、参照による置き換え効率が高い |
| 水平グラデーション | 良い | 70%〜85% | グラデーションパターンがマッチ可能性性性性 |
| 規則のなテクスチャ | 良い | 60%〜80% | テクスチャの繰り返しを参照可能性性性性 |
| ランダムノイズ | 悪い | 0%〜10% | マッチ可能性性性性な重複シーケンスがない |
| 場合然写本当 | 悪い | 5%〜20% | ピクセルの差異が大きいきく、マッチが少ないない |
2.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符号化の使用が求められています。
3. 可逆圧縮の仕組み:フィルタ行予測 + 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解凍 → 逆フィルタで復元 → 元のピクセル
両方の段階は正確な数学的逆演算であり、解凍後のピクセルデータは元のデータとバイト単位で一致します。これがPNGが可逆であることの全くのな保証です。
4. 実測:PNG vs JPEG vs WebP サイズ比較
同一のテスト画像セットを使用して、3つの形式の圧縮効果をさまざまな画像タイプで比較しました。
| 画像タイプ | サイズ | 元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 形式比較をご参照ください。
5. よくある質問(FAQ)
Q1:PNGがなぜ可逆圧縮なのか?
PNGはDEFLATEアルゴリズムを使用してデータを圧縮ます。このアルゴリズムはLZ77辞書圧縮とHuffman符号化の2段階で構成されています。LZ77は重複するバイト列を検索し、距離+長さの参照で置き換えます。Huffmanは可変長符号化により高い頻度データに短いい符号を割り場合てます。どちらの段階も可逆操作であり、解凍時には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に圧縮)。ノイズの多くい写本当では、ピクセルの差異が大きいきくLZ77が重複列を見つけられないため、圧縮率は通常10%〜30%程度です。PNGが使を用いるDEFLATEアルゴリズムの理論上の限界はZIP圧縮と同程度であり、JPEGのように情報を破棄して超高い圧縮率を得ることはできません。
Q4:PNG最適化とPNG圧縮の違いは何か?
PNG圧縮とは、元のピクセルデータをDEFLATEで符号化してPNG形式にする標準的な処理を指します。一方、PNG最適化は標準圧縮をベースにさらにサイズを削減するもので、5種類のフィルタ行予測から最適なものを選択、zlibの最も高い圧縮レベルの使用、メタデータチャンク(tEXt/gAMAなど)の削除、24ビットRGBAから8ビットインデックスカラーへの変換(色数が256色以下の場合)などの手法を含みます。SmartSlimのPNG最適化は標準PNGよりさらに15%〜30%サイズを削減できます。
まとめ
PNGが可逆圧縮を実現できる理によりは、DEFLATEアルゴリズムのLZ77とHuffmanの両段階が完全に可逆な数学的操作であり、さらにフィルタ行予測による前処理がデータの圧縮可能性性性性を高いめているからです。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以上の形式に対応。ローカル圧縮でデータは外部に送信されません。