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); }