AOYAMA Koji's PROGRAMMING BLOG

データ圧縮の基本

2025/03/01

 本記事では、データ圧縮の基本を解説します。 可逆圧縮と非可逆圧縮の違いなども紹介します。


そもそも圧縮するってどういうこと?


 データを圧縮するというのはどういうことでしょうか。 ピンと来ない方もいらっしゃるかと思います。 私も当時、圧縮とは何かさっぱりわかりませんでした。
 そのため、単純なピクセル配置の画像を用いて、わかりやすく、でも少し深く解説します。

基本のランレングス圧縮



 例えばこの図です。 「」が元データです。
 これは、 「x4とx4」と表現できますよね。 そうすればデータ量を減らすことができます。 これが圧縮するということです。
 どうでしょう。意外と単純ですよね?
 なおこれはランレングス圧縮と呼ばれる技術で、圧縮の基本です。

そんな単純じゃなくない?


 とは言え、世の中そんなに単純ではありません。 例えばこのように「」が繰り返されるピクセルの並び。

 これをランレングス圧縮をすると、以下になります。

 気づきましたでしょうか。 そうなのです。データが増えてしまうのですよね。 ここは結構重要です。 圧縮といっても、条件によってデータが増えることもあるという認識が必要です。

繰り返しに強いLZ圧縮


 ただし、このケースは大丈夫です! データの繰り返しに強い圧縮技術があります。 LZ圧縮と呼ばれるもので、以下のようになります。 「えるぜっと」と読みます。

 意味としては、「」のあと「2つ前から6回繰り返す」です。 以下の図がこのデータの伸長方法です。

 繰り返す6回のうち、最初の2回はイメージしやすいです。 まず、自分の位置より2つ前に登場した、「」を描きます。 次は、その(次の)ピクセル位置より2つ前に登場した「」が描かれます。
 そして残りの4回は、繰り返しとして描いたピクセルを再利用して繰り返します。 つまり次の位置から2つ前に描いたものは「」、次は「」、「」、「」です。
 どうでしょう? 私は初めてこれを知った時にめちゃめちゃ感動しました!

画像圧縮png



 このような圧縮方法を駆使して作られた画像フォーマットのひとつにpngがあります。 私は「ぴーえぬじー」と呼んでいますが、「ぴんぐ」と読む方もいます。 表示されているこのpng画像のファイルサイズは25KBです。 元データの情報量は442KBなのでかなり圧縮されていますね。

可逆圧縮と非可逆圧縮


 圧縮には大別して可逆圧縮非可逆圧縮があります。 「かぎゃくあっしゅく」「ひかぎゃくあっしゅく」と読みます。 今まで解説したのはすべて可逆圧縮です。 pngも可逆圧縮です。
 可逆は元のデータに完全に戻せるもの、非可逆は戻せないものです。
可逆圧縮元に戻せる
非可逆圧縮元に戻せない

元に戻せない…ってどういうこと?



 この画像をご覧ください。 これの画像フォーマットはjpegです。 「じぇいぺぐ」と読みます。 jpegは、画像における代表的な非可逆圧縮の1つだと思います。
 このjpeg画像のファイルサイズは16KBです。 先程の25KBのpngより減りました。
 非可逆圧縮ですので、厳密には元の画像から変わっているハズなのですが、どうでしょうか。 よくわからないですよね。私にはよくわかりません。 つまり人間が認識しづらい部分の情報量を削ることでデータ量を減らすのが、非可逆圧縮です。

圧縮率を変更



 圧縮ではその割合を変更できるものがあります。 この画像は圧縮率をかなりめた、 つまりデータ量をさくしたjpeg画像です。 ファイルサイズは6KBになっています。
 ここまで来ると明確に違いがわかりますね。 だいぶキタナクなっちゃってて、非可逆圧縮を実感できます。

音声も同様


 本記事では、見た目でわかりやすいように画像を用いて解説しましたが、音声も同様です。
 音楽配信サービスの音質を求めてたどり着いた「ロスレスサウンド」は、 非圧縮、または可逆圧縮されている楽曲になります。
 一方、オーディオコーデックの記事で解説した AAC, aptX, LDAC はすべて非可逆圧縮ですし、 音の圧縮体験ツールで使用した技術も非可逆圧縮です。

まとめ


 本記事では、データ圧縮の基本について単純なピクセルから構成される画像データを用いて解説しました。 また可逆圧縮と非可逆圧縮についても説明しました。
 プログラミング経験が無い方でも、こうしたちょっとしたことから、プログラミングに興味を持っていただけましたら幸いです!
 次回は圧縮関連として、音の圧縮体験ツールで用いたフーリエ変換について解説します。

補足


・本記事の画像圧縮の説明は「左から右」の順にピクセルが描画される想定です。
・「KB」はキロバイトです。バイトはデジタルデータのデータ量を表す単位、キロは1000倍です。
・個人的には「ぴんぐ」は「ping」というネットワークコマンドを想像するので「png」は「ぴーえぬじー」推しです。もちろんどちらでも大丈夫ですけれど。

カテゴリー:プログラミング
著者プロフィール
青山公士(あおやま こうじ)
中学2年生からゲームプログラミングに明け暮れる。ゲーム開発者としての代表作に「スーパー桃太郎電鉄II」(ハドソン)メインプログラマー、[PR]『ドラゴンクエストX オンライン』(スクウェア・エニックス)テクニカルディレクター/プロデューサーなどがある。[PR]「ドラゴンクエストXを支える技術」(技術評論社)著者。本ブログは今までの経験を活かしプログラミングが楽しいと感じる人が少しでも増えるようなものにしたい。 @kojibm
株式会社ロジック推し
推し情報を論理的にわかりやすく紹介することで「世の中をちょっと楽しく」をミッションに活動中。 HP X Instagram
privacy policy
ピックアップ
Loading...
最新記事
Loading...
関連記事
Loading...