はじめに


 この記事では、パソコンの比較的初心者を対象に、ファイル圧縮や解凍に関する情報を分かりやすく解説していきたいと思います。この記事を読むと、「どうしてファイルを小さくできるの?」、「そもそも圧縮とは何?」という疑問がはれるかも知れません。

圧縮って何?

 パソコンを使いこなしてくると、「圧縮」や「解凍」という言葉に出くわすようになります。皆さんは、次のような経験はありませんか?

●インターネットでソフトをダウンロードしたら、圧縮されていた。

●データーをフロッピーに入れて持ち歩きたいけれど、収まりきらないので圧縮して収めよう。

●メールにファイルを添付したいけれど、ファイルの数が多いし、サイズが大きいので圧縮してから添付しよう。

●雑誌のCD-ROMに入っていたソフトを使うために、解凍ソフト解凍した。
 
 そもそも、「圧縮」や「解凍」ってなんでしょう?また、圧縮や解凍を行う「圧縮ソフト」や「解凍ソフト」って、どういう仕組みで動いているのでしょう?

 ここでは、簡単な圧縮の例を挙げて直感的に圧縮の仕組みを理解していただきたいと思います。

圧縮の仕組み


 ファイル圧縮というのは、簡単に言うと、内容を損なうことなくファイルのサイズを小さくすることです。ただし、ファイルを圧縮して小さくしてしまうと、そのままでは内容が理解できない暗号のようなファイルになりますので、そのファイルを実際に利用する時には元の形に復元する必要があります。この操作をファイルの解凍と言います。

 また、一般的には、複数のファイルを一つの圧縮ファイル(アーカイブとも呼びます)にまとめることもファイル圧縮という言葉の意味に含めることがあります。

 では、どのようにすればファイルを小さくすることができるのでしょうか?

 一般にパソコンで使うファイル(例えばワープロのファイル)は、内容に出てくる文字や記号の出現頻度に偏りがあったり(特定の文字がよく使われたり、ほとんど使われない文字があったりする)、特定の言葉が繰り返し出て来たりします。このように、情報の分布に傾向や偏りがある場合、その情報は冗長(じょうちょう)であるといいます。圧縮とは、この情報の冗長性を利用し、ほとんど冗長度のない形に変換することで行われます。

冗長な情報とは


 いきなり「冗長」なんて難しい単語が出てきたので、少々面食らっているかもしれませんね。それでは、極端に冗長な文章の例を挙げますので、次の文を読んで、冗長さを実感してください。

極端に冗長な文章の例
私はEasy Meltというパソコン初心者向けのファイル圧縮ソフトを作ったしなぷすといいます。最近、私しなぷすの作ったパソコン初心者向けのファイル圧縮ソフトのEasy Meltを使ってくださるパソコン初心者が増えてきましたが、ファイル圧縮の原理をよく分からずに、パソコン初心者向けのファイル圧縮ソフトのEasy Meltを使っているパソコン初心者の方が多いのではないでしょうか?そこで、パソコン初心者向けのファイル圧縮ソフトのEasy Meltを作った私しなぷすは、ファイル圧縮の原理をパソコン初心者にでも直感的に理解できるように、この記事を書く事にしました。

 上の文章では、「パソコン初心者向けファイル圧縮ソフトのEasy Melt」という表現が繰り返し出てきます。しかし、Easy Meltが初心者向けファイル圧縮ソフトであることは、最初に言っているので、繰り返し言う必要はありません。また、私が「しなぷす」という名前であることは最初に言っているので、「私しなぷす」と言わなくても、単に「私」で意味が通じます。

 このように、同じ情報が繰り返し出てくる事は、情報の冗長性の典型的な例です。

 上の文章は、下のように書き直しても、意味が損なわれることはありません。

冗長度を下げた文章の例
私はEasy Meltというパソコン初心者向けのファイル圧縮ソフトを作ったしなぷすといいます。最近Easy Meltを使ってくださるパソコン初心者が増えてきましたが、ファイル圧縮の原理をよく分からずに使っている方が多いのではないでしょうか?そこで、初心者向けのソフトを作った私は、ファイル圧縮の原理を初心者にでも直感的に理解できるように、この記事を書く事にしました。

 どうですか?文字の数が減って、意味が理解しやすくなったでしょう?このように、冗長性を下げることによって、意味を損なうことなく文字数を減らすことができます。この例も、一種の情報の圧縮といえます。

圧縮ソフトのやっている事


 前に挙げた例では、確かに意味を損なわずに文字数を減らせましたが、この様な処理をするには、日本語の知識が必要ですので、パソコンに機械的にやらせるには無理があるようです。また、処理により意味は損なわれていませんが、文章自体は変わっているので、完全に元の文章に戻せる保証がありません。(後述する非可逆圧縮になっています)

 それでは、圧縮ソフトは具体的にどのように情報を圧縮しているのでしょう?ここでは、理解しやすい辞書圧縮を例に挙げて、圧縮の実際を見ていきたいと思います。

 それでは、次に挙げる例文を圧縮してみましょう。ところで、どこかで見たことのある文章ではありませんか?そうです。この記事の以前の章に出てきた文章をそのまま例文にしました。

圧縮したい文章
ファイル圧縮というのは、簡単に言うと、内容を損なうことなくファイルのサイズを小さくすることです。ただし、ファイルを圧縮して小さくしてしまうと、そのままでは内容が理解できない暗号のようなファイルになりますので、そのファイルを実際に利用する時には元の形に復元する必要があります。この操作をファイルの解凍と言います。 また、一般的には、複数のファイルを一つの圧縮ファイル(アーカイブとも呼びます)にまとめることもファイル圧縮という言葉の意味に含めることがあります。

 この例文には、「ファイル」や「圧縮」など、繰り返し出てくる言葉があります。一方で、この文章にはアルファベットが全く出てきません。そこで、「ファイル」を"F"、「圧縮」を"C"などと、頻繁に出てくる言葉をアルファベットで置き換えれば、内容を損なうことなく、文字数を減らせそうです。この様な圧縮方法を辞書圧縮といいます。

 それでは、実際に辞書圧縮をやってみましょう。ここで、どの言葉をどのアルファベットに対応させるかという表も、圧縮した文章と一緒に用意しなければならない事に注意してください。その対応表のことを辞書と呼びます。

圧縮後の文章

辞書

内容→A
という→B
圧縮→C
その→D
あります。→E
ファイル→F
こと→G
ます→H
小さく→I
する→J
して→K
める→L
うと、→M
は、→N

本文

FCBのN簡単に言MAを損なうGなくFのサイズをIJGです。ただし、FをCKIKしまMDままではAが理解できない暗号のようなFになりHので、DFを実際に利用J時には元の形に復元する必要がEこの操作をFの解凍と言いH。 また、一般的にN複数のFを一つのCF(アーカイブとも呼びH)にまとLGもFCB言葉の意味に含LGがE

 辞書に、「内容→A」などと書かれていますが、これは、文章に「内容」という言葉が出てきたら、"A"に置き換えていることを意味します。

 実際に文字数を数えてみると分かりますが、辞書を含めても、圧縮後の方が文字数が減っています。その代わりに、圧縮後は文章を読んでも、すぐには意味がわからなくなってしまっています

 辞書圧縮の場合、次のような手順で機械的に行えます。

(1)圧縮したい文章を全て読み、どの言葉がどの程度の頻度で出てくるかの統計を取る。

(2)出現頻度の高い言葉に、文字を割り当てる。

(3)もう一度圧縮したい文章を読み、文字が割り当てられている言葉を見つけたら、割り当てられている文字に置き換える。

 先の例文の場合は、全文を読んだら、「内容」、「という」、「圧縮」などの言葉が繰り返し出てくることが分かりました。そこで、それらの言葉にA、B、C…と、順にアルファベットを割り当て、辞書を作ります。最後に、もう一度文章を読み、辞書に登録されている言葉を見つけたら、対応するアルファベットに置き換えます。

 ここで注意して欲しいのですが、一度しか出てこない言葉にアルファベットを割り当てる場合でも、本文の方は文字数が減りますが、辞書を含めてトータルの文字数を考えると、一度しか出てこない言葉にアルファベットを割り当てたのでは、かえって文字数が増えます。ですから、複数回出てくる言葉にのみ、アルファベットを割り当てます

解凍ソフトのやっている事


 先ほど、ファイルを圧縮してしまうと内容が理解できなくなることをお話しました。そこで、実際に圧縮した情報を利用する場合には、情報を解凍して元に戻さなければなりません。この作業をやってくれるのが解凍ソフトです。

 解凍ソフトの仕組みを理解するために、先ほど圧縮した文章を解凍してみましょう。

 まず、辞書部分を読みます。そうすると、「内容」という言葉が"A"というアルファベットに、「という」という言葉が"B"に、「圧縮」が"C"に…という具合に、言葉がアルファベットに置き換えられていることが分かります。

 次に本文を読みます。冒頭に「FCBのN」と書いてありますが、これを解凍してみましょう。辞書によると、"F"は「ファイル」、"C"は「圧縮」、"B"は「という」、"N"は「は、」をそれぞれ置き換えたものである事がわかりますので、解凍する時には、逆にアルファベットを対応する言葉に置き換えます。そうすると、「FCBのN」は「ファイル圧縮というのは、」という文章にちゃんと戻ります。以降の文章も、同様の手順で解凍できることを確認してみてください。

さらに詳しい話


 どうですか?辞書圧縮は理解できたでしょうか?

 単純な辞書圧縮の場合、辞書を作成するのに1回、そして、辞書に基づいて言葉を置き換えるのに1回の合計2回、文章を読む必要があります。そこで、Safe MeltEasy Meltでは、1回文章を読むだけで圧縮できるように改良したスライド辞書圧縮を行っています。スライド辞書圧縮の詳細については、内容が高度になるために、ここでは説明を行いません。

 ところで、パソコンの中では、文字は数字として扱われています。例えば、Aという文字を1、Bという文字を2、Cという文字を3…という具合に、文字と数字を対応付けていると仮定します。この場合、”SCHAFT”という文字列は、19・3・8・1・6・20という数字の列として、パソコンの中では処理されています。この様に、文字に対応付けられた数字、あるいはその対応付けの一覧表のことを文字コードと呼びます。文字コードには色々な種類があるのですが、パソコンではASCII(アスキー)コードと呼ばれる文字コードを使うのが一般的です。(大型計算機などでは、他の文字コードを使う場合もあります)

 さらに、パソコンでは数字は全て2進数として扱います。私たちが普段使っている数字は0から9までの10種類の数字を組み合わせています。これを10進数と呼びます。しかし、パソコンの中では、0と1の2種類だけの数字の組み合わせで、計算などを処理しています。これが2進数です。

 先ほど文字コードの話をしましたが、半角文字の場合は、通常8桁の2進数に対応させています。また、漢字などの全角文字の場合は通常16桁の2進数に対応させています。しかし、この様な単純な割り当て方では、通常は情報が冗長になってしまうのです。

 通常の文章では、文字の出現頻度にかなりのばらつきがあります。例えば、「す」という文字は、「檸」という文字より、かなり出現頻度が高いのが普通です。そこで、出現頻度が高い「す」には例えば12桁の2進数の数字を対応させ、出現頻度の低い「檸」には18桁の数字を対応させるというように、文字の出現頻度に応じて、対応させる2進数の桁数を増減させれば、一文字を表現するのに必要な2進数の桁数の平均値を、16桁よりも少なくすることができます。この考え方に基づく圧縮方法がハフマン符号化圧縮と呼ばれるものです。Safe MeltEasy Meltでは、ハフマン符号化圧縮も、スライド辞書圧縮と併用しています。

 ハフマン符号化圧縮の具体的な方法についても、話が高度になるので、省略します。

自己解凍について

 お話したように、圧縮したファイルはそのまま使えませんので、使うときには解凍ソフトで元の形に復元しなければなりません。しかし、Safe MeltEasy Meltでは、解凍ソフトを用意しなくても、圧縮したファイルのアイコンをダブルクリックするだけで解凍できます。一体どのような仕組みになっているのでしょうか?

 実は、Safe MeltEasy Meltで圧縮したファイルには、圧縮した情報だけでなく、それを解凍するプログラムも一緒に組み込まれているのです。アイコンをダブルクリックすると、その解凍プログラムが起動して、自分自身を解凍し始めます。この様な圧縮形式を自己解凍と呼びます。

 自己解凍形式で圧縮すると、解凍プログラムが圧縮した情報にくっつけられるので、その分だけ、ファイルが大きくなってしまいます。そのため、少しでもファイルを小さくしたいのであれば、自己解凍形式ではない他の圧縮ソフト(LHAやZIPなど)を使う必要があります。ただし、自己解凍でなくなれば、解凍ソフトを用意しなければならない分だけ解凍が難しくなります。

 自己解凍プログラムの大きさは、圧縮した情報の量によらず一定です。(自己解凍プログラムの大きさは、圧縮ソフトの種類により違いますが、おおむね数〜数十キロバイトです)そのため、小さなファイルを自己解凍形式で圧縮すると、自己解凍プログラムが圧縮ファイルに占める割合が大きくなり、高い圧縮率が期待できなくなります。最悪の場合、圧縮したら、かえってファイルが大きくなることもあります。

 たくさんの情報を圧縮すると、圧縮プログラムの大きさはほとんど問題にならなくなりますから、自己解凍形式の圧縮は、大きなファイル、あるいはたくさんのファイルの圧縮に向いているといえます。

圧縮したファイルをさらに圧縮したら?

 圧縮するとファイルがどのように小さくなるかを、辞書圧縮の例を挙げて見てきました。それでは、圧縮して小さくなったファイルをさらに圧縮したら、さらに小さくなるのでしょうか?それなら、圧縮したファイルを圧縮して、さらにそれを圧縮して…と何度も圧縮を繰り返せば、いくらでもファイルを小さくできるのでしょうか?

 いえいえ、そうは問屋が卸しません。圧縮したファイルをさらに圧縮しても、ファイルサイズはほとんど変わりません。

 最初の方で説明した通り、圧縮は情報の冗長性を利用して行われます。一度圧縮すると、冗長度の低いファイルに変換されるわけですから、もう圧縮する余地はなくなっています

 「圧縮ソフトのやっている事」の章で挙げた辞書圧縮の場合、圧縮すると、繰り返し出てくる言葉は文字に置き換えられてしまいます。そのため、さらに辞書圧縮しようとしても、既に繰り返し出てくる言葉がなくなってしまっており、圧縮ができません。

 また、圧縮は情報の冗長性を利用して行っているため、冗長度の高いファイルを圧縮する場合と、冗長度の低いファイルを圧縮する場合とでは圧縮率が異なります。例えば、文章を圧縮する場合でも、同じ言葉が繰り返し出てくるような冗長な文章は圧縮率が高くなりますが、そうでなければ、圧縮率は低くなります。この記事の場合は、「圧縮」、「解凍」、「ファイル」、「ソフト」、「パソコン」など、同じ言葉が繰り返し出てきますので、単純な辞書圧縮の場合でも、かなりの圧縮率が期待できそうです。(笑)

 「Easy Meltの場合、どのくらいの圧縮率になるんですか?」などという質問を時々受けますが、「何を圧縮するかにより圧縮率は変わります」というのがその答えです。

可逆圧縮と非可逆圧縮

 「圧縮の仕組み」の章で、圧縮とは「内容を損なうことなくファイルのサイズを小さくすること」と述べました。しかし場合によっては、内容が少々劣化してもいいから圧縮率を高くしたい(ファイルを小さくしたい)という場合があります。

 内容の多少の劣化が許される代表的な例が、画像ファイル音声ファイルです。画像や音声の場合は、多少画質や音質が劣化しても許容される場合があります。

 一方で、例えばプログラムや金銭を扱うデータ−などは、少しでも内容が変化すると困ります。プログラムの場合は、内容が変化してしまうと正常に動作しなくなりますし、金銭を扱う場合は、1円でもデータ−が変化してしまうと、そのデータ−は信用できなくなるでしょう。

 Safe MeltEasy Melt、あるいはLHAやZIPといった、汎用のファイル圧縮ソフトは、どのようなファイルを圧縮するかを事前に想定できないため、全く内容の劣化が起こらないように圧縮を行います。このように、内容の劣化を伴わない圧縮を可逆圧縮(かぎゃくあっしゅく)と呼びます。

 画像や音声などを圧縮する場合に、多少の内容の劣化を許容する圧縮を非可逆圧縮といいます。非可逆圧縮の例としては、画像圧縮のJPEG、音声圧縮のMP3などが有名です。

 Windowsパソコンの場合は、画像は通常BMP(ビットマップ)ファイルという形式で保存されます。BMPファイルのままではかなり大きなデータ−になるので、JPEGファイルに圧縮すると、ファイルサイズが10分の1程度にまで小さくできます。その代わり、元の画像とJPEG形式で圧縮した画像を比べると、JPEGでは少し画質が低下しています。

 また、音声について見ると、Windowsパソコンの場合は、音声は通常WAV(ウェーブ)ファイルという形式で保存されます。これを圧縮してMP3ファイルにすると、ファイルサイズが10分の1程度にまで小さくできます。この場合も、元の音声と比較すると、MP3で圧縮した音声は、少し音質が低下しています。

 画像ファイルや音声ファイルをSafe MeltEasy Meltなどの可逆圧縮の圧縮ソフトで圧縮しても、JPEGやMP3ほどにはファイルを小さくできません。その代わり、画質や音質は全く劣化しません。

非可逆圧縮の仕組み

 JPEGやMP3といった、非可逆圧縮は、どのような仕組みで高い圧縮率を実現しているのでしょう?基本的には、人間が感じにくい情報を積極的に捨ててしまう事により、高い圧縮率を実現しています。

 それがどういう事かを具体的に説明します。若干説明が難しくなってしまいますが、理解できなくても結構です。

 JPEGの仕組みを簡単に見てみましょう。

 パソコン中では画像は、画素という光の点の集合として扱われています。(画素はドットということもあります。)そして、各画素の光の強さを数値化し、数値の集合として画像が表現されています。(カラー画像の場合は、光の3原色それぞれについて、光の強さが数値化されます。)

 JPEGで画像を圧縮する場合は、まず画像を8×8画素の正方形の領域に分解します。そして、各8×8画素のブロックを、離散コサイン変換(DCT)し、空間周波数領域でブロックの情報を表現します。画像を離散コサイン変換した場合、通常は高い周波数領域の信号は弱く、また人間が感じ取りにくいという性質があります。そこで、JPEG圧縮の場合は、高周波数成分の記録精度を落としたり、省略してしまったりして、情報を積極的に捨てています。

 かなり難しい話になりましたね。学問的にみて不正確になるのを承知で、上記の話を簡単に説明しましょう。

 つまり、通常の画像には、あまり細かい模様は含まれておらず、光の強さの変化は緩やかな場合が多いという事です。また、細かい模様が含まれていても、人の目はそれを正確に読み取ることはできません。ですから、細かい模様の情報を捨ててしまっても、パッと見ただけでは画質の劣化が感じられにくいのです。この様に、JPEGでは細かい模様の情報を捨てることによって、圧縮率を上げています。

 MP3の場合はどうでしょうか。

 音声の情報は、パソコン中ではPCMデータ−として扱われています。音というのは、空気の圧力の時間的な変化の事ですが、一定の時間間隔でこの圧力の変化の様子を数値化して記録する方法をPCMといいます。音声の場合も、画像の場合と同様に、数値の集合として表現されています。

 MP3で圧縮する場合には、音声を一定の時間間隔で区切り、各間隔の音声を修正離散コサイン変換(MDCT)することによって周波数領域で信号を表現します

 人間の耳には、極端に高い音(高周波数)や低い音(低周波数)は感じられにくいので、これらの音は記録精度を下げたり省略したりします。

 また、大きな音と小さな音を同時に聞くと、小さな音が大きな音でかく乱されてしまって聞き取りにくくなるという性質が人間の耳にはあります。この効果をマスキング効果と呼びます。大きな音と小さな音が混ざっている場合は、マスキング効果によって小さな音が聞き取りにくくなるので、小さな音の情報は、記録精度を下げたり省略しても、音質の劣化が目立ちません。

 この様に、MP3では、聞き取りにくい音の情報を積極的に捨てて、高い圧縮率を達成しています。

 以上のように、非可逆圧縮では、人間の目や耳の性質を利用して、人間の感じ取りにくい情報を積極的に捨ててしまう事で高い圧縮率を実現しています。そのため、画像圧縮用の非可逆圧縮のソフトでは、画像以外の情報を圧縮する事はできません。音声圧縮の場合も同様です。この点が、どんなファイルでも一応は圧縮できる汎用の圧縮ソフトと異なります。反面、圧縮の対象を限定することで、高い圧縮率を達成できます。

 なお当然の事ですが、JPEGやMP3のファイルを、Safe MeltEasy Meltで圧縮しようとしても、それらのファイルは既に圧縮済みのため、さらにファイルを小さくする余地はほとんどありません。