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