ビットマップ方式ではピクセルごとに色を指定するので、RGBの各色256段階の階調を持つ画像ならば各色8ビット、ピクセルごとに24ビット必要になる。
8ビットを1バイトとするので、
ピクセル数×3バイト
のデータ量になる。
ピクセル数 208×160=33280
データ量 33280×3= 99840バイト
透明度をサポートする場合はさらにデータ量は増える。pngでは256段階の透明度を持たせることができる。この場合1ピクセルあたりさらに1バイト増える。
階調を各色64段階に下げるとどうだろうか。このためには各色6ビット必要になるのでピクセルごとに18ビットである。8ビットを1バイトとして保存するシステムだと18ビットでも3バイト必要になるので、データ量は変わらない。
階調を下げることでデータ量を下げるとすれば、各色32階調まで下げる必要がある。32諧調ならば5ビットになるので、3色で15ビット。これならば2バイトで収まる。
ピクセル数×2バイト
のデータ量になる。これだと色数は32×32×32=32768色使え、データ量を2/3にすることができる。
しかし、このような方法はあまり使われていない。
階調を各色256段階のまま、データ量を下げることができる。
その画像で使用する色を256色選んで登録しておき、各ピクセルには256色のうちどの色かの情報だけ記録します。こうするとピクセルごとに1バイトで済む。
使用している色が256以内ならば、色は正確です。256より多いときは似ている色に変えてしまうか、隣り合わせの色が混ざって見えると似た色になるようにする。これをディザという。
この方法はpngでもできるが、gifが有名。
方式 | 256色パレット方式 | 24ビットカラー |
画像 | ||
データ量 | ピクセル数 208×160=33280 データ量 33280×1+768= 34048バイト 768はパレットデータ |
ピクセル数 208×160=33280 データ量 33280×3= 99840バイト |
ファイルの大きさ | smpl01indx.png 28171バイト | smpl01.png 64435バイト |
ファイルの大きさとデータ量が異なるのは次に述べるデータの圧縮のため。
ファイルに保存するときには、データを圧縮して保存するのが一般的である。圧縮をするとファイルの大きさを小さくすることができるので上記のデータ量のファイルができることはほとんどない。圧縮にはファイルを読み込んだときに完全に元に戻る方式と完全には戻らない方式がある。上記のパレット方式は元の画像が256色以内なら元に戻る圧縮、256以上なら元に戻らない圧縮である。
完全に元に戻せる圧縮を可逆圧縮という。
同じ色が100ピクセル続くなら、まともにやると300バイトのデータが必要であるが何かの取り決めをして「この色が100ピクセル続く」というデータにすれば数バイトで済む。画像データでなくてもデータの繰り返しを見つけて短い書き方に直して記録することはよく研究されたくさんの方式がある。
完全に元に戻せない圧縮を非可逆圧縮という。
256色以上ある画像をパレット方式にするのも非可逆圧縮だが、非可逆圧縮で最も有名なのは jpg (ジェイペグ)である。
この方式は写真のような色が少しずつ変化するような画像に使うと劇的に圧縮することができる。非可逆なのでデータの内容を変化させてしまうが上手に使うとほとんどわからないレベルにできる。また、圧縮の程度を調節できるので、画質が悪くてもいいなら品質を落としてファイルを小さくできる。画質を重視するなら品質を上げて大きめのファイルで我慢すればよい。
この方式はデジタルカメラで広く使われている。
次のような画像をさまざまな方式で保存してファイルの大きさを比べる。
最後の.bmpは圧縮をせずに保存したもの。Windowsの.bmp形式の画像がこれ。
jpgの値は品質を85にした場合。この程度でも普通の写真では違いはわからない。ファイルの大きさが105KBから15KBになるということは14%ぐらいに圧縮されたことになる。
次のような画像をさまざまな方式で保存してファイルの大きさを比べる。
最後の.bmpは圧縮をせずに保存したもの。Windowsの.bmp形式の画像がこれ。
jpgの値は品質を85にした場合。このような種類の画像はjpgは苦手なので、pngを使うのがよい。ファイルの大きさが105KBから1KBになるということは0.95%ぐらいに圧縮されたことになる。