😇

画像 まとめて圧縮するか?個別圧縮するか?

2024/12/06に公開

今回、複数の画像をディレクトリに入れてまとめて圧縮する方法と、1画像ごとに圧縮する方法では圧縮率に違いがあるのか疑問に思い、実験を行いました。

条件

サンプルデータ

SONY α7Ⅳのロスレス圧縮RAW画像3枚(合計119.9MB)

  • 40.9MB
  • 41.2MB
  • 37.8MB

圧縮方法

ライブラリやOSSの使用も検討しましたが、普段のワークフローで使用しているBandzipというデスクトップアプリケーションを用いて実施しました。

7zを使用しました。その他の設定は以下のとおりです。

  • 圧縮形式:7z
  • 圧縮方法:最高圧縮
  • 圧縮方式:LZMA
  • ソリッドブロックサイズ:ソリッド

実験

3枚の場合

元データ総量: 119.9MB

データ形式 圧縮後 圧縮率 削減率
ディレクトリ 104.5MB 87.2% 12.8%
個別 104.8MB 87.4% 12.6%

まとめて圧縮した方が圧縮後のデータサイズが0.2%小さい結果となりました。ただし、3枚では誤差の可能性があると考え、20枚で再実験を行いました。

20枚の場合

元データ:815.1MB

データ形式 圧縮後 圧縮率 削減率
ディレクトリ 709.9MB 87.1% 12.9%
個別 714.2MB 87.6% 12.4%

20枚の場合でも、まとめて圧縮した方が圧縮後のデータサイズが0.5%小さい結果となりました。

まとめ

本実験では、複数の画像をディレクトリにまとめて圧縮する方法と、1画像ごとに個別に圧縮する方法を比較しました。3枚の場合は圧縮率に0.2%の差が見られ、20枚の場合は0.5%の差が確認されました。これにより、画像数が増えるほどディレクトリ単位でまとめて圧縮する方が、若干ながら圧縮効率が向上することが示されました。

考察

今回の結果において、ディレクトリ単位での圧縮が個別圧縮よりも高い圧縮率を示した理由として、以下の点が考えられます。

  1. 圧縮アルゴリズムの特性:
    使用した7z形式のLZMA圧縮方式は、データの繰り返しやパターンを効率的に検出・圧縮する能力があります。複数の画像を一つのアーカイブにまとめることで、アルゴリズムが画像間の類似性や共通のデータパターンをより多く検出でき、全体としての圧縮効率が向上する可能性があります。

  2. ソリッドブロックの効果:
    圧縮設定でソリッドブロックサイズを「ソリッド」に設定したことにより、複数のファイルを一続きのデータとして扱います。これにより、ファイル間の冗長性が高まり、圧縮率が向上します。特に、RAW画像は多くのメタデータや類似したデータ構造を持つため、ソリッド圧縮の効果が顕著に現れたと考えられます。

  3. 実験規模の影響:
    少数のファイル(3枚)では差異が小さいものの、ファイル数が増える(20枚)ことで、まとめて圧縮する利点がより明確になります。多くのファイルを扱う場合、圧縮アルゴリズムがより多くのデータを参照し、全体としての最適化が進むため、圧縮率の向上が見られました。

結論

今回の実験から、7z形式のLZMA圧縮においては、複数のRAW画像をディレクトリ単位でまとめて圧縮する方が、個別に圧縮するよりも若干高い圧縮率を達成できることが確認されました。これは、圧縮アルゴリズムの特性やソリッドブロック設定などが寄与していると考えられます。大量の撮影データを効率的に圧縮する際には、ディレクトリ単位でのまとめ圧縮を使用していこうと思います。

補足

この記事は、GMOペパボ EC Advent Calendar 2024の2日目の記事です。1日目は、GMO Developers Day 2024に登壇したです。是非ご覧ください。

Discussion