GIFのカラーパレットを操作する

GIFのカラーパレットを操作するには、FLYやGD.pmを使う
方法がポピュラーですが、GIFのカラーパレットの仕様を
知っていると、これらを使わなくても簡単にカラーパレット
の操作を行うことができます。

カラーパレット(Global Color Table)はGIF(87a or 89a)
ファイル先頭より14バイト目から、

R G B R G B R G B....

という順番で格納されてます(後述しますが格納されてい
ないこともあります)。

カラーパレットの長さは、先頭11バイト目に3ビット長で
格納されている、Size of Global Color Table(0から7の
値を取ります)をnとして、2の(n+1)乗 * 3バイトとなりま
す。
ただし、同じく11バイト目に1ビット長で格納されている、
Global Color Table Flagが0の場合、Global Color Tabl
eは存在しないことになっています。

例えば標準出力からGIFを読み取って、Global Clolor 
Tableの5番目の色を白に変えて標準出力に出すには、以下
のようにするだけでもOKです(下のは簡単に書いたのでち
ょっとメモリがもったいないですが)。

	#!/usr/local/bin/perl

	$n = 4; # ($n + 1)番目の色を変える。
	$gif = join("", <>); # GIFを読み込む。
	substr($gif, 13 + ($n*3), 3) = "\xff\xff\xff";
	print $gif; # 出力

面倒なので作っていないのですが、カラーテーブルの数を取得する関数、
指定されたカラーテーブルを変更する関数などを作っておくと便利かも
しれません。