しらぎくさいと実験室で実験していたGIF画像形式を用いたフルカラー画像生成スクリプトに関する顛末です。
GIF画像形式は最大256色のインデックスドカラーのみを取扱う規格として知られております。
ですから、GIF画像形式では257色以上の画像を取扱う事は不可能だと思われております。
しかしながら、GIF画像形式では複数の画像フレームを収納する事が出来(これによりアニメーションGIF画像も可能になります)、しかもここの画像データに対して個別パレットを設定する事も出来ます、
つまり、実際に画像に用いられている色を収集し、それを最大255色のパレットに分割して個々のフレームに個別パレットとして割り当て、それらを重ね合わせて表示させる事で257色以上の画像を実現させる事は可能になります。
画像連結出力スクリプトのフルカラー対応版でのサンプルをフルカラーGIF画像形式で作成させるPerlスクリプトの実行結果です。
ファイルの容量はフルカラー対応版と較べると以下のような違いが見られました。
出力させる画像形式 | 処理に掛かった所要時間 | 出力させたファイルの容量 | |
---|---|---|---|
GIF画像形式 | 216色に減色した場合 | 0.30秒前後 | 3.5キロバイト前後 |
アニメーションの原理でフルカラーにした場合 | 0.40秒前後 | 8〜10キロバイト | |
JPEG画像形式 | 高圧縮率(超低画質) | 0.45秒前後 | 2.5キロバイト前後 |
PNG画像形式 | 圧縮にZlibを用いた場合 | 0.26秒前後 | 5.5キロバイト前後 |
圧縮にPerlによる圧縮ルーティンを用いた場合 | 0.40秒前後 | 10キロバイト前後 |
このように、結果としては、それ程悪い結果には見えませんでした。
しかしながら、その後実験を続けていくうちに、フルカラーGIF画像形式を実現するスクリプトの公開は難しいと判断し、発表を断念する事としました。
その理由は以下の通りです。
200ピクセルズ四方の画像でも二万色近く使われている場合もあります。
特にJPEG画像形式で効率よく圧縮されているような画像は、得てして色数が多く、GIF画像形式などでの圧縮には向かないものです。
GIF画像形式に採用されているLZW圧縮アルゴリズムや、PNG画像形式に採用されているデフレート圧縮アルゴリズムは同じデータが連続するような場合に効力を発揮します。
しかしながら、色数が多過ぎると、これらの圧縮アルゴリズムでの対応が著しく困難になります。
余りにも色数が多いと、圧縮出来るどころか却ってデータを肥大化させる事にもなり兼ねません。
サンプルではせいぜい一千色程度なので大した問題にはなりませんでした。
しかしながら、例えば二万色だと79枚のフレームが必要になります。
つまり、二万色の画像を生成する場合、一度に79枚のGIF画像を生成する操作を行わなければならなくなる訳です。
サーヴァへの負荷は相当なものとなるのは火を見るより明らかでしょう。
一度は実現しようとしたフルカラーGIF画像でしたが、このような状況なので正式な公開は断念しました。
しかしながら、このスクリプトを実験していく過程で、フルカラー画像の扱いについて幾つか分かった点があったので、これらをフルカラー画像の減色処理に活用出来たらと思っております。