GIFの透過できたぁぁ

 
GIF87a規格のGIFファイルは試してないので、うまくいきません。。
GIF89a規格のGIFファイルは、透過されましたvVやったぁvV
 
アニgifがちゃんとなるかも、試してないので、一枚動画推奨です。。
もしくは、アニgifがちゃんとなるかは、今度試します。

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

if(!isset($_FILES["img"])){
  print '<html>
  <body>
  <form enctype="multipart/form-data" action="./clearGif.php" method="POST">
  <input type="file" name="img">
  <input type="text" name="clear0" value="7">←透過しない場合は[false]を入力する<br>
  <input type="submit">
  </form>
  </body>
  </html>';
} else {

  $clear_arr = array();	// 透過色配列
  $i = 0;
  while(isset($_POST["clear".$i])){
    $clear_arr[$i] = (int)$_POST["clear".$i];
    $i++;
  }

  $imgpath = $_FILES["img"]["tmp_name"];
  $fp = fopen($imgpath,"rb");
  $c = fread($fp,4);
  $src .= $c;
  $c = fread($fp,1);
  if(ord($c) === 0x39) {	// GIF89aである(アニメーションかも)
    $src .= $c;
    $i = 0;
    // Graphic Control Extension調整
    while(!feof($fp)){
      do{
        $c = fread($fp,1);
        $src .= $c;
      }while(ord($c) !== 0x21 && !feof($fp));	// 拡張ブロック開始まで送る
      if(feof($fp)){
      	break;
      }
      $c2 = fread($fp,1);
      $src .= $c2;
      if(ord($c2) === 0xf9){	// Graphic Control Extension固定値
        $src .= fread($fp,1);	// 固定値
        
        $c3 = fread($fp,1);
        if(is_int($clear_arr[$i])){
          $c3 = $c3 | pack("c",0x01);	// 透過する
        } else {
          $c3 = $c3 & pack("c",0xfe);	// 透過しない
        }
        $src .= $c3;
        
        $src .= fread($fp,2);	// 表示する際の遅延時間(元ファイルのまま)
        $src .= pack("c",$clear_arr[$i]);	// 透過色のインデックス
        fread($fp,1);	// 遅延時間(2B)・透過色インデックス(1B)分を送る
        $i++;
      }
    }
  } else {
  	$src .= $c;
  }
  while(!feof($fp)){
    $src .= fread($fp,1);
  }
  header("content-type:image/gif");
  print($src);
}