\r\n\r\n

ファイル圧縮の仕組みは?

ソフトウェアエンジニアは、小さなスペースに大量のデータを収めるための新しい方法を常に開発しています。ハードディスクが小さかった頃もそうでしたが、インターネットの登場により、その重要性はさらに高まっています。ファイル圧縮は、私たちをつなぐ重要な役割を担っています。送信するデータを少なくすることで、ダウンロードを高速化し、混雑するネットワークでより多くの接続を可能にします...

ソフトウェアエンジニアは、小さなスペースに大量のデータを収めるための新しい方法を常に開発しています。ハードディスクが小さかった頃もそうでしたが、インターネットの登場により、その重要性はさらに高まっています。ファイル圧縮は、私たちをつなぐ重要な役割を担っています。送信するデータを少なくすることで、混雑したネットワークでもより速くダウンロードし、より多くの接続を可能にすることができるのです。

では、その仕組みはどうなっているのでしょうか。

この質問に答えるには、非常に複雑な数学を説明する必要があり、もちろんこの記事でカバーできる範囲を超えていますが、基本を理解するために数学的にどのように機能するかを正確に理解する必要はありません。

最も一般的なテキスト圧縮ライブラリは、2つの圧縮アルゴリズムに依存しており、どちらも非常に高い圧縮率を達成することができる。これらは「LZ77」と「ハフマン符号化」であるが、非常に複雑であるため、ここでは詳しく説明しない。まず、個々の文字に短いバイナリコードを割り当てることで、ファイルサイズを小さくしています。もっと詳しく知りたい方は、コードの仕組みに関するこちらの記事や、Computerphileの記事で解説していますので、ぜひご覧ください。

一方、LZ77は比較的シンプルなので、ここではそれについて説明します。重複する単語を削除し、より小さな「キーワード」に置き換えようとするものです。

この短い記事を例にとってみましょう。

LZ77アルゴリズムは、このテキストを見て、「howtogeek」が3回繰り返されていることに気づき、次のように変更します。

そして、読み返すときには、(h)を "howtogeek "に置き換えて、元の文言に戻す。

私たちはこれを「可逆圧縮」と呼んでいます。入力データと出力データは同じであり、何も失われることはありません。

実際、LZ77はキーリストを使う代わりに、2番目と3番目のマッチをメモリ内のリンクで置き換えています。

そこで今度は、(h)に到達すると、「howtogeek」を見直して読みます。

より詳しい解説をご希望の方は、Computerphileのこちらの動画が大変参考になります。

これは理想的な例です。実際には、ほとんどのテキストは数文字のキーで圧縮される。例えば、"there"、"their"、"then "などの単語の中に "the "が出てきても、圧縮されます。「は、"there"、"their"、"then "などの単語で出現しても圧縮されます。テキストを繰り返すことで、とんでもない圧縮率を得ることができるのです。howtogeek "という単語のテキストファイルを100回繰り返す。元のテキストファイルは3KBの大きさですが、圧縮後は158バイトにしかなりません。圧縮率は95%に近い。

もちろん、これは非常に極端な例で、同じ単語を何度も繰り返しているだけだからです。一般に、テキスト主体のファイルに圧縮形式(ZIPなど)を使用すると、30~40%程度の圧縮が可能な場合があります。

ちなみに、このLZ77アルゴリズムはテキストだけでなく、すべてのバイナリデータに対して有効であるが、ほとんどの言語では多かれ少なかれ繰り返しの単語が使われるため、通常はテキストの方が圧縮しやすい。例えば、中国語のような言語は、英語よりも圧縮するのが難しいかもしれません。

画像や動画の圧縮の仕組みは?

映像圧縮と音声圧縮は、まったく異なる原理で動作します。データを失うことなく可逆圧縮できるテキストとは異なり、画像は一部のデータが失われる、いわゆる「ロッシー」な圧縮が可能です。圧縮すればするほど、データは失われていきます。

そのため、人々はあのひどい見た目のJPEGを何度もアップロードしたり、共有したり、スクリーンショットしたりします。

これは私が撮ったスクリーンショットですが、全く圧縮されていません。

このスクリーンショットをPhotoshopで何度も処理し、その都度低画質のJPEGで書き出したところ、次のような結果が得られました。

悪そうでしょう?

まあ、あくまで毎回JPEG品質0%で書き出すという最悪のケースですが。比較のために、50%の品質のJPEGを示しますが、拡大してよく見ないと、ソースPNG画像とほとんど見分けがつきません。

この画像のPNGサイズは200KBですが、この50%画質のJPEGは28KBにすぎません。

では、なぜこれほどまでに省スペースになるのでしょうか。さて、JPEGのアルゴリズムは素晴らしい工学の塊です。ほとんどの画像は数字の羅列で、それぞれの数字が画素を表しています。

JPEGはそのようなことはありません。その代わりに、異なる強度の正弦波を重ねた離散コサイン変換というものを使って画像を保存しています。64種類の方程式を使うのですが、そのほとんどが使われないままになっています。Photoshopなどの画像アプリケーションのJPEGの品質スライダーで、いくつの方程式を使うか選択できるのはこのためです。その後、ハフマン符号化により、さらにファイルサイズを小さくする。

このため、jpegの圧縮率は非常に高く、数メガバイトのファイルを、品質によっては数キロバイトに圧縮することができる。もちろん、使いすぎれば、次のような結果になります。

その画像はひどいですね。しかし、わずかなJPEG圧縮でファイルサイズに大きな差が出るため、Webサイトでの画像圧縮にJPEGは非常に有効です。ウェブ上で見ることができる画像のほとんどは、特にデータ接続の悪いモバイルユーザーのために、ダウンロード時間を節約するために圧縮されています。実は、ページの読み込みを速くするために、いかにマニアックな画像もすべて圧縮されているのですが、おそらく皆さんはそれに気づくことはないでしょう。

動画圧縮

動画は画像と少し仕組みが違います。JPEGで動画の全フレームを圧縮すると思うかもしれませんし、確かにそうなのですが、動画を圧縮するにはもっと良い方法があるのです。

各フレーム間の変化量を計算し、その変化量だけを保存する「フレーム間圧縮」という方法を用いています。そのため、例えば数秒間の動画の中で比較的静止しているショットがあれば、圧縮アルゴリズムがシーン内の一定したものをすべて保存する必要がないため、容量を大幅に節約することができるのです。フレーム間圧縮は、デジタルTVやウェブビデオがある主な理由です。これがなければ、動画は数百ギガバイトに達し、2005年のYouTube開設当時の平均的なハードディスクのサイズよりも大きくなってしまいます。

また、フレーム間圧縮は静止画に最も適しているため、色紙が動画の品質を損なってしまうのはこのためです。

注:GIFはこれができないので、アニメーションGIFは通常非常に短くて小さいが、それでもかなり大きなファイルサイズになる。

動画でもうひとつ覚えておきたいのは、ビットレート(1秒間に許容されるデータ量)です。例えば、ビットレートが200キロバイト/秒の場合、映像は非常に見栄えが悪くなります。ビットレートが上がると品質が向上しますが、1秒間に数メガバイトを超えると、返ってくる量が少なくなります。

クラゲの動画から撮影したズームフレームです。左が3Mb/s、右が100Mb/sです。

ファイルサイズは30倍になったが、画質はあまり向上していない。一般的にYouTubeの動画は、それ以上の動画は気付かれない可能性があるため、回線にもよりますが、2~10Mb/s程度です。

このデモは実際の映像ではもっとうまくいくので、自分で確認したい場合は、ここで使用したのと同じビットレートのテスト映像をダウンロードしてください。

音声圧縮

音声圧縮は、テキストや画像の圧縮と非常によく似た仕組みになっています。JPEGが画像から見えない部分を削除するのに対し、音声圧縮は音に対して同じことを行います。実際のギターがとても大きな音であれば、弦を鳴らすギターの音は必要ないのでしょう。

MP3もビットレートは48、96kbps(ローエンド)から128、240kbps(かなり良い)、320kbps(ハイエンドオーディオ)まで使われており、おそらくよほど良いヘッドフォン(耳)を使わないとその差は分からないだろう。

オーディオ用の可逆圧縮コーデックもあり、主なものはFLACで、LZ77エンコーディングにより完全なロスレス・オーディオを実現している。FLACの完璧な音質を保証する人もいますが、MP3の普及により、ほとんどの人はその違いがわからないか、気にしないようです。

あなたが興味を持っているかもしれない記事

匿名者
匿名者

0 件の投稿

作家リスト

  1. admin 0 投稿
  2. 匿名者 0 投稿

おすすめ