アニメgifのループ回数をいじるクラス。
例によって動くかわかんないけど
会社の昼休みに息抜きで書きました。
<?php /** * Created on 2009/2/25 * (c) mana */ class AniGifLoop{ var $fp; var $fp_way_flag = false; function __construct($filepath){ $this->fp = fopen($filepath,"rb"); } function getLoopCount(){ // public / int if($fp_way_flag === true)return -1; $fp_way_flag = true; $this->before(); $fp = $this->fp; fread($fp,1); // 0x01固定値を送る $application_data = fread($fp,2); $simobyte = $application_data>>8; $kamibyte = ($application_data|0xff)<<8; return $simobyte | $kamibyte << 8; } function setLoopCount($num){ // public / ByteString if($fp_way_flag === true)return false; $fp_way_flag = true; if($num>0xffff)$num = 0xffff; $simobyte = $num>>8; $kamibyte = (num|0xff)<<8; $src = $this->before(); $fp = $this->fp; $src .= fread($fp,1); // 0x01固定値を送る $src .= pack($simobyte,"c"); $src .= pack($kamibyte,"c"); $src .= $this->after(); return $src; } private function before(){ $fp = $this->fp; $c = fread($fp,4); $src .= $c; $c = fread($fp,1) if(ord($c) === 0x39){ // GIF89aである $src .= $c; $i = 0; while(!feof($fp)){ // Application Extensionを調整 do{ $c = fread($fp,1); $src .= $c; }while(ord($c) !== 0x21 && !feof($fp)); // Extension Introducer if(feof($fp)){ // Application Extensionが見つからなかった break; } $c2 = fread($fp,1); $src .= $c2; if(ord($c2) === 0xff){ // Extension Label(1B) $src .= fread($fp,13); // Application Data(nB)直前まで送る break; } } return $src; } function after(){ $fp = $this->fp; while(!feof($fp)){ $src .= fread($fp,1); } return $src; } }