2012-06-02

[gimp] PNG 画像のファイルサイズを小さくするには

画面のキャプチャなどを JPEG で保存すると色が急激に変化するところの周りにもじゃっとしたノイズが乗るので通常 PNG で保存すると思いますが、何も考えず保存するとおそらくRGB各色8ビット(True Color) でアルファチャンネルなしの1ピクセルあたり24ビットのファイルが出来上がります。ネットも速くなったので通常これでクライアント側は困ることはないと思いますが、配信側の都合上転送量を削減したいなど極限まで絞りたいという場合は、もっと効率的なビット割り当てで同じような見た目になるインデックスカラーを検討してみる価値があります。

インデックスカラーとはピクセルごとにRGB値を記録するのではなく、あらかじめ色の目次(インデックス)を作ってから、各ピクセルでは目次の何番の色を置いたらよいかを記録する方式です。例えば256色インデックスカラーなら、log2 256 = 8 から、各ピクセルでは8ビットの割り当てで済みます。

GIMP を使ってファイルサイズをケチった画像を作るには、パレットを画像> モードから例えば256色に減色してから、PNGでエクスポートします。スクリーンショットなどはディザリングはオフにした方がごま塩のようなピクセルが入らなくて綺麗だと思います。写真などの場合はディザリングを有効にした方がいい感じになると思います。

True Color 24 bits/pixel (30,920 bytes)

Indexed Color 8 bits/pixel (10,708 bytes)


ピクセルあたりの単価が 24bit から 8bit になったので、ファイルサイズはだいたい三分の一になっているのが分かると思います。代償として減色時にパレットを使い切ってしまったときはぴったり済んだ場合を除いて情報が失われています。

上の場合は減色されて情報が失われていることが良く見ると分かります。幅広のグラデーションが階段状になっているのが見えるでしょうか?

さらに過激派な方は16色インデックスカラーに挑戦してみましょう!失われるものも多いですがファイルサイズはさらに半分になります。

Indexed Color 4 bits/pixel (5,029 bytes)