会社のお昼休み〜。
gifを透明にしたいのですが、
>「透明になるとか、そういう情報を入れたブロック」
の対策をしたソースを書いたので、載せます。
動作確認は家で。。w
<?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 { $imgpath = $_FILES["img"]["tmp_name"]; $clearcolorindex = 29; // パラメタ $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("cc",0,0); // 表示する際の遅延時間 $src .= pack("c",$clearcolorindex); // 透過色のインデックス $src .= pack("c",0x00); // Graphic Control Extension終了 $src .= $c; // Image Block開始位置まで送ったので付ける } else { // GIF89aである $src .= $c; // Graphic Control Extension調整 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); $c3 |= 1; // 透過する $src .= $c3; $src .= fread($fp,2); // 表示時間(ポインタを送る) $src .= pack("c",$clearcolorindex); // 透過色のインデックス fread($fp,1); // 送り } } while(!feof($fp)){ $src .= fread($fp,1); } header("content-type:image/gif"); print($src); } ?>
次は、アニメーションgif対策(画像のブロックが何度も出てくるもの)だっ!