ZIP圧縮てもファイルは実際には圧縮されい理由

フラストレーションの溜まる状況

こういう経験はありませんか。と僚から50MBのPDFレポートが送られてきます。メールには大きすぎると思い、7-Zipに放り込んで圧縮レベルを「超圧縮」に上げて待ちます。結果は?49MBのアーカイブ。結局そのまま送り、受信者が展開すると、ファイルは依然として50MBのまま — 1バイトも小さくっていません。

これは偶然ではありません。すでに圧縮済みのMP4、JPG、PDFをZIPファイルに入れても、サイズはほとんど変わりません。しかし、とじ7-Zipを生のTXT、BMP、CSVファイルのフォルダに対して実行すると、アーカイブは元のサイズの10分の1にまで縮みます。

ぜこれほどの違いが出るのでしょうか?答えは、ほとんどの人が学ぶことのい区別にあります。アーカイブ圧縮コンテンツ圧縮は根本のに異る操作のです。この違いを理解すれば、縮もうとしいファイルをZIP圧縮て時間を無駄にするのをやめられます — そして状況に応じて正しいツールを選べるようにります。

アーカイブ圧縮:コンテナの技術

アーカイブ圧縮はコンテナレベルで動作します。2つのことを行います。複数のファイルを1つのコンテナにまとめること、そしてバイトストリームの統計の冗長性を排除くするためにできる逆圧縮アルゴリズムを適用することです。

おじみのアーカイブ形式 — ZIP、7Z、TAR.GZ、RAR — はすべて内部で似たようアルゴリズムに依存しています。ZIPはデフォルトでDEFLATEを使用し、これはLZ77とハフマン符号化を組み合わせたものです。LZ77は繰り返されるバイト列を見つけて距離と長さの参照に置き換えます。ハフマン符号化は次に、より頻出する文字にはより短いバイナリコードを、より珍しい文字にはより長いコードを割りされるてます。7-Zipの7Z形式はデフォルトでLZMAを使用し、これはLZ77をレンジ符号化で拡張し、はるかに大き辞書ウィンドウをサポートするため、通常はDEFLATEより良い圧縮率を実現します。

ここが重要ポイントです。アーカイブ圧縮はファイルの内容を一切変更しません。各ファイルを不透明バイトストリームとして扱い、そのストリーム内の統計のパターンを探します。ZIPアーカイブを展開すると、ファイルはオリジナルとバイト単ビットで完全にと一のものとして戻ってきます — 1ピクセルも変わりません。

これが冒頭のシナリオを説明します。PDFは内部の画像ストリームとフォントストリームをすでにDEFLATEで圧縮ています。JPG自体が圧縮形式です。MP4は動画フレームの圧縮にH.264やH.265を使います。これらのファイルはすでに冗長性を絞り出されているため、アーカイブアルゴリズムには扱うべきものがほとんど残っていません。対照のに、BMPビットマップ、非圧縮のWAV音声、プレーンテキストのCSVファイルは圧縮できる繰り返しに満ちています — そここそがアーカイブ圧縮の輝く場ところです。

アーカイブ圧縮が真に優れているのは、複数ファイル間の冗長性を排除く点です。あるフォルダに100枚のスクリーンショットが入っていて、それぞれにとじロゴの透かしと似たツールバーがあるとします。LZMAの大き辞書はこれらのファイル間の繰り返しを特定し、各ファイルを個別に圧縮するよりはるかに良い圧縮を実現できます。これが、ファイルを1つのアーカイブにまとめる方が1つずつ圧縮するより効率の理由です。

ここで圧縮辞書の役割を理解しておく価値があります。DEFLATEもLZMAも、最も近見たデータのスライディングウィンドウ — 辞書 — を維持し、新しいバイトをそれと照合します。DEFLATEのウィンドウは32KBに固定されており、繰り返しをどこまで遡って見つけられるかが制限されます。LZMAは64MB以上の辞書を設定でき、バッチの最初のファイルに現れたパターンが最後のファイルで再度び現れたときにも参照できることを意味します。これが、多数の似たファイルを含む1つの大きアーカイブが、多数の小さアーカイブよりはるかに良く圧縮される理由です。辞書が参照できる材料が多く、ファイル間の冗長性が取り込まれます。各ファイルを個別にまとめると、各アーカイブは空の辞書から始まり、ファイル間の冗長性は完全に失われます。

コンテンツ圧縮:内側から再度構築する

コンテンツ圧縮は別の道を取ります。あたがいくつファイルを持っていても気にしませんし、何もまとめません。代わりに、単一ファイルの内部構造に潜り込み、そのファイルの種類に固あるのメソッドでデータを最適化します。

手法はファイルの種類によってまったく異ります。

画像はリサンプリング(4000×3000のオリジナルを1920×1080に縮小)、再エンコード(PNGをWebPやAVIFに変換)、色深さの削減(24ビットを8ビットインデックスへ)ができるです。8MBのスマホ写真は、解像度と品質を合理のに調整すれば、目に見える違いく500KB未満に日常のに圧縮できます。

PDFは、埋め込み画像をダウンサンプリングし、非圧縮のフォントストリームをサブセット化されたCFFに変換し、参照されていいオブジェクトを削除くし、重複するXObjectsを統合可能性ます。高解像度の図版が満載の50MBのデザイン文書は、コンテンツ圧縮後に5〜8MBに縮むことがよくあります。

PDFは、それ自体が本質的にコンテナであるため、特に示唆に富む例です。PDFは各画像をストリームオブジェクトとして、各フォントを別のストリームとして、テキストを符号化されたコンテンツストリームとして格納します。ほとんどの生成ソフトウェアはすでにテキストとフォントのストリームにDEFLATEを、写真画像にはJPEGやDCTを適用しています。だからこそ、アーカイブツールにかけたPDFはほとんど縮まいのです — 低い枝の果実はすでに取られています。コンテンツ圧縮は代わりにすべてのストリームを再度検証します。対象ディスプレイに必要解像度を超える画像をダウンサンプリングし、許容できる場合はできる逆画像ストリームをJPEGに変換し、埋め込みサムネイルや非テーブル示レイヤーのようメタデータを破棄し、重複するフォームXObjectsを統合します。結果はとじデータをパッケージむより薄いラッパーではく、根本のにより軽い文書です。

フォントはサブセット化でき、数万文字を収めたフォントファイル全体を出荷するのではく、文書で実際に使われている数十のグリフだけを残せます。

動画と音声はより効率のコーデックで再エンコードできます — 例えばH.264からH.265にアップグレードすると、と等の品質でビットレートがほぼ半分にります。

コンテンツ圧縮には決定の特徴があります。ファイルの内部データを変更することであり、多くの場合非できる逆です。圧縮された画像は元のピクセルに復元できません。サブセット化されたフォントは完全書体に再度構築できません。トレードオフは、ファイルがソースの時点で小さくることです — 展開は不要で、そのまま使える状態にります。

視覚ので比較

下の図は、2つのアプローチ間のワークフローの根本の違いを示しています。

Archive compression vs content compression difference flowchart: 7-Zip packaging path vs content-level compression path

左側のパスは、ファイルの内容が決して変わらい「まとめる–変換送する–展開する–復元する」サイクルです。右側のパスは、ファイル自体が再度構築される一方への「分析する–最適化する–生成する」プロセスです。

コード例:違いを目で見る

Pythonを使うと、その区別が鮮明にります。

zipfileによるアーカイブ圧縮


import zipfile
import os

# アーカイブ圧縮:複数ファイルを1つのzipにまとめる
source_files = ['report.pdf', 'photo.jpg', 'data.csv']
archive_name = 'bundle.zip'

with zipfile.ZipFile(archive_name, 'w', zipfile.ZIP_DEFLATED) as zf:
    for file in source_files:
        zf.write(file)

# 結果を計測
original = sum(os.path.getsize(f) for f in source_files)
packed = os.path.getsize(archive_name)
print(f"Original total: {original / 1024 / 1024:.2f} MB")
print(f"Archive size:   {packed / 1024 / 1024:.2f} MB")
print(f"Ratio: {packed / original * 100:.1f}%")

# 典型の出力(すでに圧縮形式のファイル):
# Original total: 58.30 MB
# Archive size:   57.10 MB
# Ratio: 97.9%

より率に注目してください — ほとんど変化していません。これらのファイルはすでに圧縮形式ので、アーカイブ圧縮は無力です。

PILによるコンテンツ圧縮


from PIL import Image
import os

# コンテンツ圧縮:画像データそのものを最適化
src = 'photo.jpg'
dst = 'photo_optimized.jpg'

img = Image.open(src)
before = os.path.getsize(src)

# 3つのアプローチによるコンテンツ圧縮
img.thumbnail((1920, 1080))  # 解像度を下げる
img.save(dst, 'JPEG',
         quality=75,        # 品質を下げる
         optimize=True,     # ハフマンテーブルを最適化
         progressive=True)  # プログレッシブ符号化

after = os.path.getsize(dst)
print(f"Original size: {before / 1024 / 1024:.2f} MB")
print(f"Optimized size: {after / 1024:.2f} KB")
print(f"Ratio: {after / before * 100:.1f}%")

# 典型の出力:
# Original size: 8.20 MB
# Optimized size: 480.50 KB
# Ratio: 5.7%

とじ「圧縮」という言葉でありながら、一方は58MBを57MBに変え、もう一方は8MBを480KBに変えます。その差は、それぞれが何に触れるかから生じます。前者はコンテナを並べの代わりにえるだけで、後者はコンテンツを書き直します。

一目でわかるで比較

項目アーカイブ圧縮コンテンツ圧縮
何をするかファイルをまとめ、冗長性を排除くするファイルの内部データを最適化する
対象ファイルコンテナ(複数ファイルレベル)ファイルの内容(データレベル)
手法DEFLATE / LZMA どのできる逆アルゴリズムリサンプリング / トランスコーディング / サブセット化
劣化のある無できる逆。展開時に完全に復元できるほとんど非できる逆。元に戻せない
使用メソッド使用前に展開が必要そのまま使用できる、展開不要
典型のシナリオ複数ファイルの変換送、バックアップサイズ削減、Web最適化、メール添付
有効性冗長性に依存。圧縮済みファイルにはほぼゼロ10倍以上の圧縮率を実現できる

ケーススタディ:50MBのPDFの2つの運命

実際の50MBのPDF(高解像度のスキャン画像が複数ページ)を取り上げ、で比較してみましょう。

アプローチA:アーカイブ圧縮

  • ツール:7-Zip、LZMA2 超圧縮
  • 結果:50MB → 49.2MB
  • 理由:PDFの内部画像ストリームはすでにDCTDecodeでJPEG圧縮され、フォントストリームはFlateDecodeを使っています。アーカイブ圧縮はもはや利用できる冗長性を見つけられません。

アプローチB:コンテンツ圧縮

  • 操作:埋め込み画像を150 DPIにダウンサンプリング、JPEG品質を75に下げる、フォントをサブセット化、参照されていいオブジェクトを削除く
  • 結果:50MB → 6.8MB
  • 理由:圧縮はPDFの大一部 — 高解像度スキャン — を狙います。150 DPIら、画面での読書は事実上とじに見えますが、ファイルは7分の1にります。

2つの「圧縮」は7倍の差を生み出します。そのPDFをメールで送るのが目のら、アプローチBが答えです。アプローチAは単に労力を無駄にします。

正しいアプローチの選択

両方のツールを手にすれば、決定は単純にります。何を達成しようとしているかを自問してください。

  • 一度に多数のファイルを移動したい?アーカイブ圧縮を選びましょう。1ステップでまとめ、チェックサムを付けてファイル間の冗長性を絞り出します — バックアップ、ソースコードの配布、フォルダ構造の変換送に最適です。
  • 単一のファイルを小さくしたい?コンテンツ圧縮を選びましょう。メールへけの50MBのPDFはZIPでは縮みませんが、内部画像をダウンサンプリングすれば劇のに縮みます。
  • 両方が必要?まず各ファイルにコンテンツ圧縮を適用してから、結果をアーカイブ圧縮でまとめます。順序は譲れません。コンテンツの最適化は、ファイルの内部がまだアクセスできるうちに、アーカイブに封印される前に行わければりません。

役立つメンタルモデルがあります。アーカイブ圧縮は変換送のコストを下げ、コンテンツ圧縮は保管のコストを下げます。ファイルがすでに変換送できるほど小さいがサーバーに恒久的に置かれているら、コンテンツ圧縮はダウンロードごとに節約される帯域幅で元を取ります。一度だけファイルの束を出荷するら、アーカイブ圧縮がより軽い選択肢です。

よくある質問

Q1:ぜ7-ZipはPDF、JPG、MP4をほとんど縮めないのですか?

これらのファイルはすでに圧縮形式だからです。PDFは内部の画像ストリームとフォントストリームをDEFLATEで圧縮、JPGは画像データをDCT変換で圧縮、MP4は動画フレームをH.264/H.265で圧縮ます。アーカイブアルゴリズムはすでに絞られたデータに直面するため、取り除くくべき統計の冗長性が残っていません。アーカイブ圧縮は生の非圧縮データ — BMP、WAV、プレーンテキスト — に有効です。

Q2:コンテンツ圧縮は品質を損いますか?サイズと品質のバランスはどう取れば?

ほとんどのコンテンツ圧縮は非できる逆ですが、劣化の度合いは制御できるです。画像の場合、解像度と品質を調整することでサイズと鮮明さをトレードします — 画面ら品質75で72〜96 DPIで通常十分にですが、印刷には300 DPIが必要です。フォントのサブセット化はできる逆でテーブル示に影響しません。鍵は、一律の設定を適用するのではく、圧縮レベルを使用ケースに合わせることです。

Q3:アーカイブ圧縮とコンテンツ圧縮は一緒に使えますか?

はい、そして実際よく使われます。典型のワークフローは、まずコンテンツ圧縮を適用して各ファイルをソースで縮め、次にアーカイブ圧縮を適用して小さくったファイルを変換送用にまとめます。順序が重要です — まずコンテンツ、次にアーカイブ。順序を逆にすると、ファイル構造がアーカイブ内に閉じ込められ、コンテンツ圧縮が介入できくります。まずコンテンツを最適化してからまとめれば、両方の利点を取り込めます。

結論

アーカイブ圧縮とコンテンツ圧縮はどちらも「圧縮」という名前を帯びていますが、異るレイヤーで動作します。アーカイブ圧縮はコンテナレベルで動作し — できる逆のにまとめて冗長性を排除しますが、すでに圧縮されたファイルには効果が限られます。コンテンツ圧縮はデータレベルで動作し — 多くの場合非できる逆でファイルの内部を再度構築しますが、ソースの時点で縮めます。

次に、小さくらい「圧縮済み」ファイルを見つめたとき、自問してください。コンテナを圧縮ているのか、それともコンテンツを?正しいレイヤーを選べば、圧縮はついにその仕事を果たします。

関連記事:

ファイル圧縮をお探しですか?SmartSlim をお試しください

独自開発のRust圧縮エンジンに基づき、PDF/画像/動画/Office/OFDど10大分類40+形式をサポート。ローカル圧縮でデータは外部に持ち出されません。