本文へスキップ

oCompressの仕組み

ファイルをドロップしたときに何が起きるのか、何もアップロードされていないことをどう確かめるのか、そして可逆圧縮と非可逆圧縮の本当の意味を解説します。

要点だけを先に

ツールのページを開くと、ブラウザはページと、圧縮エンジンという小さなプログラムをダウンロードします。ファイルを追加すると、ブラウザがそれを読み込み、圧縮エンジンがお使いの端末のプロセッサーで処理し、結果をダウンロードとしてお渡しします。ファイルがネットワーク経由で送られることは一度もありません。全体の流れは次のとおりです。

  1. 読み込み。まずページとツールの画面が読み込まれます。ファイルの種類ごとのエンジン(画像、動画と音声、文書)は、該当するファイルを追加したときに初めて取得されるので、使わないコードをダウンロードすることはありません。
  2. ファイルの読み取り。ブラウザがページに許可するのは、選んだファイルへのアクセスだけです。端末内のほかのものには一切アクセスできません。
  3. 圧縮。処理はブラウザのバックグラウンドスレッドであるWeb Workerで行われるため、ページの反応が鈍くならず、いつでもキャンセルできます。
  4. 保存。圧縮したファイルはメモリ上に作成され(大きな動画はブラウザの専用ストレージ上)、ブラウザの通常のダウンロード機能で、1つずつまたはZIPで保存されます。

ブラウザで動いているもの

最新のブラウザは、WebAssemblyによってコンパイル済みのコードをネイティブに近い速度で実行でき、WebCodecsというインターフェースを通じて、端末のハードウェア動画エンコーダーをウェブページから利用できるようにしています。oCompressはその両方を使っています。

  • 画像:JPEGにはMozJPEG、PNGにはOxiPNGとパレット量子化、WebPにはGoogleのlibwebpのエンコーダー、AVIFにはlibavif、SVGにはSVGO、GIFとTIFFには専用のデコーダーとエンコーダーを使っています。JPEG、PNG、WebP、AVIFのコーデックはWebAssemblyにコンパイルされています。
  • 動画と音声:WebCodecsと、MP4やWebMなどのコンテナを読み書きするMediabunnyライブラリを使っています。エンコードには、利用できる場合はグラフィックチップのハードウェアエンコーダーを使うため、ブラウザ内でも高速に処理できるのです。MP3ファイルはLAMEエンコーダー、FLACファイルはlibFLACで書き出します。どちらもWebAssemblyにコンパイルされ、必要なときだけ読み込まれます。
  • 文書:オープンソースのPDFライブラリとZIPライブラリをもとにした独自のコードでPDFやOfficeファイルを開き、中の画像を画像用コーデックで再圧縮して、新しいファイルを書き出します。

私たちが配布しているライブラリはすべてオープンソースです。大半はMIT、BSD、Apache 2.0などの寛容なライセンス、MediabunnyはMPL 2.0、LAME MP3エンコーダーはLGPLで、独立した差し替え可能なファイルとして提供しています。バージョンとライセンスを記したライブラリの一覧をご覧ください。

何もアップロードされていないことを確かめる方法

私たちの言葉をそのまま信じる必要はありません。簡単なテストが2つあります。

  • オフラインにする。ツールのページを開き、ファイルを1つ圧縮してエンジンを読み込ませてから、Wi-Fiやモバイルデータ通信をオフにして、同じ種類の別のファイルを圧縮します。ネットワークを必要とするものが何もないので、問題なく動作します。
  • 通信を監視する。Chrome、Edge、FirefoxでF12キーを押し、「ネットワーク」タブを開いてファイルを圧縮します。私たちのサイトから圧縮エンジンのコードが読み込まれる様子や、アクセス解析と広告のリクエストは見えますが、ファイルを運ぶリクエストはありません。10MBの写真なら10MBのアップロードとして表示されるはずですが、そのようなものはありません。

ページは、「数MBのJPGが圧縮された」といった匿名の利用イベントをGoogleアナリティクスに送信しています。これらのイベントに含まれるのは、ツール、ファイルの種類、そしてサイズ・削減量・処理時間のおおまかな範囲だけで、ファイル名や内容が含まれることはありません。

可逆圧縮:同じ内容を、より少ないバイト数で

可逆圧縮は冗長な部分、つまり何度も保存されているものや予測できるものを見つけ出し、よりコンパクトに書き直します。デコードはその処理を正確に逆にたどります。ほぼすべての可逆形式には、次の3つの考え方が使われています。

  • 予測。画像の隣り合ったピクセルや、音声の連続したサンプルは、たいてい似ています。値そのものではなく予測との小さな差を保存すれば、残る数値はほとんどがゼロに近くなります。PNGのフィルターやFLACの線形予測はこの方式です。
  • 繰り返し。繰り返し現れるデータ列を、前に出てきたものへの短い参照に置き換えます。これはZIP、PNG、Officeファイルで使われるDEFLATEのLZ77の部分です。
  • エントロピー符号化。よく出る値には短い符号を、まれな値には長い符号を割り当てます(ハフマン符号や算術符号)。

可逆圧縮には自然な限界があります。ランダムなノイズは予測できないため、粒子の粗い写真やノイズの多い録音は、劣化させずに大きく縮めることはできません。JPEGをZIPに入れるなど、すでに圧縮されたファイルを圧縮してもほとんど節約にならないのも、これが理由です。

非可逆圧縮:なくなっても気づかないものを取り除く

非可逆コーデックは、人間の目や耳がほとんど感じ取れない情報を捨てることで、さらに先へ進みます。JPEGとWebPは色を明るさより低い解像度で保存し、細かい高周波成分を丸めて捨てます。MP3、AAC、Opusは大きな音に隠れた音を省きます。H.264などの動画コーデックは、ときどき完全な画像を1枚保存し、その間は主に動きと変化だけを記録します。

どれだけ捨てるかを決めるのは、品質やビットレートの設定です。ほどほどの設定なら劣化に気づくのはとても困難ですが、行き過ぎると典型的なノイズが現れます。画像ではブロックやにじみ、音声では金属的な音や水中のような音、動画では速い場面のにじみです。

ツールが約束すること、しないこと

  • 元より大きいファイルをお渡しすることはありません。結果が小さくならなかった場合は元のファイルをお返しし、すでに最適化されていることをお知らせします。
  • 文書と音声ファイルは、同じファイルと同じ設定なら同一のバイト列になります。ハードウェアの動画エンコーダーでは、実行のたびに数バイト異なることがあります。
  • 文書のテキストはテキストのままで、ページが画像に変換されることはありません。
  • GPSの位置情報などの画像のメタデータは初期設定で削除され、カラープロファイルと回転情報は保持されます。位置情報、機器、日時といった動画のメタデータも初期設定で削除されます。音声は、オフにしない限りタグとカバー画像を保持します。

私たちが約束できないのは、特定の削減率です。どれだけ減らせるかは、ファイルがどのように作られたかで完全に決まります。スマートフォンの写真やスキャンしたPDFには通常たっぷり余地がありますが、すでに最適化されたファイルにはほとんどありません。ツールはファイルごとに、圧縮前と圧縮後の正確なサイズを表示します。

ブラウザで圧縮する際の限界

ブラウザのタブはメモリの限られたサンドボックスで、それが現実的にできることの範囲を決めています。ツールが受け付けるのは、画像は200MBかつ1億画素まで、PDFとOfficeファイルは300MBまで、動画と音声はパソコンで4GBまで(スマートフォンでは1GBまで)です。ただし、長い4K動画はそれでもタブのメモリに収まらないことがあります。速度はハードウェアしだいです。高速なWindowsパソコンのChromeでの私たちのテストでは、1080pの動画1分に約20秒、2400万画素の写真1枚に約2.5秒かかりました。スマートフォンではずっと遅くなることがあります。動画とほとんどの音声変換にはWebCodecsが必要で、最新のChrome、Edge、Opera、Firefox 130以降、Safari 26以降が対応しています。WAVとAIFFは、WebCodecsがなくてもMP3、FLAC、WAVに変換できます。

WMA、AVI、WMVなど、ブラウザにデコーダーがまったくない形式もあり、古いバイナリ形式のOfficeファイルは安全に書き換えられません。こうした形式については、壊れているかもしれないファイルを作る代わりに、ツールが選択肢を説明します。ブラウザには重すぎる作業なら、動画にはHandBrake、文書にはLibreOfficeといったデスクトップソフトをおすすめするのが誠実な答えです。