2.〜4.を元データがなくなるまで繰り返す。回まで繰り返してよい。nではわかりにくいかもしれないので、具体例をあげてみます。8ビット画像の場合なら、以下のようになります。元データから8ビット読み、9ビットにゼロ拡張して書き込む。2.を253回繰り返す。2.〜4.を元データがなくなるまで繰り返す。回まで繰り返してよい。17ビットは元イメージのサイズに関係なく同じビット数なので無視している)。4ビット画像の場合なら、以下のようになります。元データから4ビット読み、5ビットにゼロ拡張して書き込む。2.を13回繰り返す。2.〜4.を元データがなくなるまで繰り返す。回まで繰り返してよい。13ビットは元イメージのサイズに関係なく同じビット数なので無視している)。サンプルcel2gifKISS/GSのセルを無圧縮のGIFに変換します。-Iオプションを指定するとインタレースGIFを生成します。無圧縮GIFはサイズが大きいですし、インタレースにしてサイズが大きくなることもないので、インタレースにしたほうがいいでしょう。インタレースを指定すると画像をすべて一度にメモリに読み込むので、メモリの少ない環境ではメモリ不足で変換に失敗することがあります。8ビットのセルに対応しています。パレット(KCF)は24ビットのみの対応です(手抜き)。KISSの透明色情報やオフセット情報もそのまま変換します。Console用ですが、付属のソースを再コンパイルすればたいていの環境で使えるでしょう。本プログラムの無断再利用の禁止を禁止します【謎】。gzipで圧縮あまり知られていませんが、HTTPでは転送するデータを圧縮(に限らず符号化)することができます。このとき、HTTPヘッダのContent-Encodingというフィールドで符号化の方式を示します。x-gzipを付加します。いうことは、これを使えば無圧縮GIFをgzipで圧縮してネットワークの帯域を減らせるのでは...と期待が掛かりますが、世の中そんなに甘くありません。Content-Encodingヘッダは、HTTP/1.0のころからあるにもかかわらず、かならずしも対応ブラウザは多くないのです。x-gzipに対応しました。それ以前のバージョンでは壊れた絵のアイコンがむなしく表示されるだけです。4.06以降であっても、gzip圧縮した画像を表示できるのは直接画像のURLを指定したときだけで、IMG要素などでHTMLに埋め込んだ場合には最初の1回は表示されません。右クリックして「画像を表示」すれば表示されたり、すでにキャッシュに入っている画像なら表示されたりはしますが、初めて訪問した客が壊れた絵のアイコンばかり目にしたら、そのまま退散してしまうような気がします。これではGIFの透過表示の機能などは有効に活用できません(単体で表示できればいいならそれこそPNGで十分です)。x-gzipに対応しているらしいことは確認しましたが、条件によって表示されたりされなかったりします。条件はいまだに不明です。x-gzipも認識しなくなるようです。Accept-EncodingやContent-EncodingはHTTP/1.0からあるはずなのですがどうしてそういう仕様なのかは謎です。IE4では最初に1回直接画像を表示しないとIMGでは表示されないようです。1回でも表示しておけばあとは大丈夫なようです。x-gzipを認識しません。1.9aなども試してみましたが、全滅でした。どれ1つとしてgzip圧縮したGIFを表示できません。iCabに至ってはタイプ10のエラーとかで落ちる始末。4.0以降など、極めて限られた環境でしか表示できません。これならPNGのほうがまだマシです。GIFアニメが手離せないという向きには多少は意味があるかもしれませんが。Mozillaでは完全対応しました。M17以降でMNGにも対応したのでMNGを使ったほうがいいかもしれませんが。PR1には残念ながらまだ組み込まれていないようです。IE5(Win)ではサポートされなくなったようです。Content-NegotiationApacheの場合、MultiViewsオプションを有効にして同じディレクトリにfoo.pngとfoo.gif.gzとfoo.gifを置いておき、fooという名前のリソースを要求すると、ブラウザの能力に合わせて最適な形式の画像を自動的に選んで返してくれます。image/pngを受け付けるならfoo.pnggzip符号化を受け付けるならfoo.gif.gzどちらでもないならfoo.gifというわけでいろんな形式の画像を全部用意しておくのが一番いいかもしれません。GIF画像のサンプルがあります。独自拡張ではありませんが、GIFは256色までしか扱えないとあまりにも広く信じられているためにビューアーによっては表示できない可能性があります。2などでは表示できるようです(2013-12-11追記)が、アニメーションGIFとみなされて「フレーム」間に強制的にウェイトが入るためのろのろと表示されます。29ではこの問題が修正されました。ビューア」では表示できませんでした。ペイントでは開くことはできて一瞬で表示されますが、GIFのまま保存すると256色に減色されてしまいます。8.1のペイントで開いても正しく表示されません。このGIFファイルの作成に使われているANGIFライブラリは、時期的な関係(最終更新1999年)から特許の問題を避けるために無圧縮GIFを生成しています。formatGIFの解説(英語)。上記のリンクはここで見つけました。generator(2005-04-02)ABYSSより。ここでもフルカラーのGIFを扱っています。ここによるとIE3やNetscape3の頃から対応していた模様。BMP画像連結モジュールリンク切れ(2001/08/07)メールが来てたのを思い出したのでリンクしてみる。トップからリンクが張られてない。して返事を待ってるのだろうか。いうメールには見えなかったのだが。JAPAN閉鎖(2000/09/07)いつの間にかこっちにリンクを張られていたので正式に張り返す。表示処理に関してはかならずLZW相当の技術が必要なので、とのことだが、無圧縮GIFだけ展開できればいいならエンコードの逆をやればいいだけなのでLZWの出る幕はないはず。5に移行しなさいという教育的指導なのだろうか。追加UNISYSの特許の請求項にある辞書テーブルを使わないで圧縮・展開を行う方法を紹介しています。[200002]無圧縮GIFをgzipで圧縮してHTTPヘッダにContent-Encodingといれればブラウザが勝手に展開して表示してくれるというアイデアが紹介されています。同じようなことはみんな思い付くものです。紹介文を読むといかにもほとんどのブラウザで使えそうに書かれていますが、これに対応したブラウザの範囲は実はそんなに広くありません(詳細)。下手をするとPNGのほうが広いくらいです。2.0からあるにもかかわらずいまだにIEもNNもほとんどサポートしていません。無圧縮でエンコードしてからgzipするなんて変則的なことをしてまでGIFを使う理由としては既存のブラウザとの互換性が大きいと思うのですが、ちょっと現実の実装に無頓着すぎるのではないかと思いました。(英語)同じことを考えた人はすでにいたようです。LZWクリア符号からストリームを始めるように書かれているが、必要ない。2^(N-1)-3符号ごとにクリア符号を出力するよう書かれているが、実際には2^N-3符号ごとでじゅうぶんである。いう2点を押さえておくとわずかですがサイズを小さくできます。FAQここにも無圧縮GIFの作り方が書かれています。ここで説明されている方式では最初にクリア符号を出力している点がわずかに無駄なだけで、あとはほぼ最小の無圧縮GIFを出力できます。上記2つのリンクはここで見つけました。FAQのアルゴリズムを実装したlibungifを配布しているサイトです。UNIXで、giflibの代わりとしてよく使われているようです。追加BMPを無圧縮GIFに変換するコンバータを公開しています。ソースは公開されていないし使用許諾契約でデコンパイル・リバースエンジニアリング・逆アセンブル等も禁止されているので、何かの間違いでLZWを使っていたらとか思うと怖くて使えたものではありません。おまけに自分のプログラムのバグをデコーダのせいにしています。いやバグとは限りませんがソース公開されていませんし。-Bオプションをつけなくてもcel2gifより大きなGIFを生成するくせに、-Bオプションをつけても私の使っている2種類の画像ローダのどちらでもまともに表示できないGIFを生成してくださるのです。使用許諾契約で批判や好意的でない批評を禁止するとかいうマイクロソフトよりすごいことをしているので誰も教えてくれないというか教えようにも教えられないのでしょうね。自ら選んだ道ですからまったく問題ありませんが。(2000/04/03追記)それでもレポートを送った勇気ある人のおかげで修正されたようです。(2000/05/22追記)本人からメーられた。長いので読んでないけど。何か言いたいことがあるならWebページで全世界にでも公開すればいいと思う。追加BMPをRLE圧縮のGIFに変換するコンバータを公開しています。1.3は公開停止になってPNGを使う版に差し替えられてしまった点がやや気に掛かります。Colorを扱えるという事実を知ったのでリンクを追加。2004/06/20特許の期限切れに伴い先頭に注意書きを追加。agree-pngバナーを削除。2003/12/29Libungifのリンクを更新。Googleで検索しても出てくるのは繋がらなくなった古いサイトへのリンクばかりだが...。2000/05/22リンクを更新。2000/04/03cel2gifを更新。オフセット付きのcelを正しく変換できていなかった。2000/03/04gzipで圧縮すればいいと書いてあるページが紹介されていた。しまった、こんなことならもっと早く書いておけばよかった。パクりだと思われそうだがgzip関連の項目を追加。2000/02/13元画像のピクセル数が(8ビット画像の場合で)254*x-1ピクセルだったとき、出力される画像ブロックの末尾に(無駄な)クリア符号がついていた。254*x-2ピクセルだったときは終端符号の後ろにクリア符号が出力されてゴミになってしまっていた(ローダの表示には影響ないようだが)。これで特定サイズの画像はさらに1〜2バイト小さくなるはず。FAQの解説やlibungifのソースを見ていて、クリア符号の出力間隔は2度目以降は2^N-2符号ごとでいいことに気付く。2000/02/11@niftyの会議室であまりにも素晴らしいサイトを教えてもらったので思わずリンクに追加。M.Kimura(emk)。