GIFファイルに透過・表示秒数の情報を入れるソース(未完成)

引き続き会社のお昼休み。
アニgif対策をしてみました。
例によって動作確認は家で。。

<?php
/**
 * Created on 2008/12/26
 * (c) mana
 */

if(!isset($_FILES["img"])){
  print '<html>
  <body>
  <form enctype="multipart/form-data" action="#" method="POST">
  <input type="file" name="img">
  <input type="submit">
  </form>
  </body>
  </html>';
} else {

  $delay_arr = array();	// 表示秒数配列
  $clear_arr = array();	// 透過色配列
  $i = 0;
  for(;;){
    if(isset($_POST["delay".$i]){
      $delay_arr[$i] = $_POST["delay".$i];
    } else {
      $delay_arr[$i] = 50;
    }
    if(isset($_POST["clear".$i]){
      $clear_arr[$i] = $_POST["clear".$i];
    } else {
      $clear_arr[$i] = false;
    }
    if(!isset($_POST["delay".$i] && !isset($_POST["clear".$i]){
      break;
    }
    $i++;
  }

  $imgpath = $_FILES["img"]["tmp_name"];
  $fp = fopen($imgpath,"rb");
  $c = fread($fp,4);
  $src .= $c;
  $c = fread($fp,1);

  if(ord($c) === "7"){	// GIF87aである(Graphic Control Extensionなし)(一コマ)
    $src .= pack("c",9);	// ヘッダをGIF89aにする

    while(ord($c) !== 0x2c && !feof($fp)){// GIF HeaderをImage Block開始まで送る
      $c = fread($fp,1);
      $src .= $c;
    }

    // Graphic Control Extensionを付ける
    $src .= pack("ccc",0x21,0xf9,0x04);
    $src .= pack("c",1)	// 透過
    $src .= pack("s",delay_arr[0]);	// 表示する際の遅延時間
    $src .= pack("c",$clear_arr[0]);	// 透過色のインデックス
    $src .= pack("c",0x00);	// Graphic Control Extension終了

    $src .= $c;	// Image Block開始位置まで送ったので付ける

  } elseif(ord($c) === "9") {	// GIF89aである(アニメーションかも)
    $i = 0;
    $src .= $c;
    // Graphic Control Extension調整
    while(!feof($fp)){
      while(ord($c) !== 0x21 && !feof($fp)){	// 拡張ブロック開始まで送る
        $c = fread($fp,1);
        $src .= $c;
      }
      $c2 = fread($fp,1);
      $src .= $c2;
      if(ord($c2) === 0xf9){	// Graphic Control Extension固定値
        $src .= fread($fp,1);	// 固定値
        $c3 = fread($fp,1);
        if($clear_arr[$i] !== false){
          $c3 |= 0;	// 透過しない
        } else {
          $c3 |= 1;	// 透過する
        }
        $src .= $c3;
        $src .= pack("s",delay_arr[$i);	// 表示する際の遅延時間
        $src .= pack("c",$clear_arr[$i]);	// 透過色のインデックス
        fread($fp,1);	// 送り
        $i++;
      }
    }
  } else {	// gifじゃない
    exit();
  }
  while(!feof($fp)){
    $src .= fread($fp,1);
  }
  header("content-type:image/gif");
  print($src);
}