我正在使用GIFEncoderclass將一系列GIF圖像轉換爲動畫Gif。GIFEncoder.Class.php和無循環GIF動畫
我想要做的是設置循環,以便它不重複。
當我將循環設置爲1時,在Chrome和IE中它不會播放一次...但會循環一次(所以播放兩次)。在FireFox中,雖然它按預期工作,但播放一個不會循環播放。
這是GIFEncoder中的錯誤嗎?
我做錯了什麼?
我該如何解決這個問題?
我的代碼
$gif = new GIFEncoder (
$frames, // frames array
$time, // elapsed time array
1, // loops (0 = infinite)
0, // disposal
3, 2, 1,
0,// rgb of transparency
"url" // source type
);
GIFEncoder類
Class GIFEncoder {
var $GIF = "GIF89a"; /* GIF header 6 bytes */
var $VER = "GIFEncoder V3.00"; /* Encoder version */
var $BUF = Array ();
var $OFS = Array ();
var $SIG = 0;
var $LOP = 0;
var $DIS = 2;
var $COL = -1;
var $IMG = -1;
var $ERR = Array (
'ERR00'=>"Does not supported function for only one image!",
'ERR01'=>"Source is not a GIF image!",
'ERR02'=>"Unintelligible flag ",
'ERR03'=>"Does not make animation from animated GIF source",
);
/*
:::::::::::::::::::::::::::::::::::::::::::::::::::
::
:: GIFEncoder...
::
*/
function GIFEncoder (
$GIF_src, $GIF_dly, $GIF_lop, $GIF_dis,
$GIF_red, $GIF_grn, $GIF_blu, $GIF_ofs,
$GIF_mod
) {
if (! is_array ($GIF_src) && ! is_array ($GIF_dly)) {
printf ("%s: %s", $this->VER, $this->ERR [ 'ERR00' ]);
exit (0);
}
if (is_array ($GIF_ofs) && count ($GIF_ofs) > 1) {
$this->SIG = 1;
$this->OFS = $GIF_ofs;
}
$this->LOP = $GIF_lop === false ? false : (($GIF_lop > -1) ? $GIF_lop : 0);
$this->DIS = ($GIF_dis > -1) ? (($GIF_dis < 3) ? $GIF_dis : 3) : 2;
$this->COL = ($GIF_red > -1 && $GIF_grn > -1 && $GIF_blu > -1) ?
($GIF_red | ($GIF_grn << 8) | ($GIF_blu << 16)) : -1;
for ($i = 0; $i < count ($GIF_src); $i++) {
if (strToLower ($GIF_mod) == "url") {
$this->BUF [ ] = fread (fopen ($GIF_src [ $i ], "rb"), filesize ($GIF_src [ $i ]));
}
else if (strToLower ($GIF_mod) == "bin") {
$this->BUF [ ] = $GIF_src [ $i ];
}
else {
printf ("%s: %s (%s)!", $this->VER, $this->ERR [ 'ERR02' ], $GIF_mod);
exit (0);
}
if (substr ($this->BUF [ $i ], 0, 6) != "GIF87a" && substr ($this->BUF [ $i ], 0, 6) != "GIF89a") {
printf ("%s: %d %s", $this->VER, $i, $this->ERR [ 'ERR01' ]);
exit (0);
}
for ($j = (13 + 3 * (2 << (ord ($this->BUF [ $i ] { 10 }) & 0x07))), $k = TRUE; $k; $j++) {
switch ($this->BUF [ $i ] { $j }) {
case "!":
if ((substr ($this->BUF [ $i ], ($j + 3), 8)) == "NETSCAPE") {
printf ("%s: %s (%s source)!", $this->VER, $this->ERR [ 'ERR03' ], ($i + 1));
exit (0);
}
break;
case ";":
$k = FALSE;
break;
}
}
}
GIFEncoder::GIFAddHeader ();
for ($i = 0; $i < count ($this->BUF); $i++) {
GIFEncoder::GIFAddFrames ($i, $GIF_dly [ $i ]);
}
GIFEncoder::GIFAddFooter ();
}
/*
:::::::::::::::::::::::::::::::::::::::::::::::::::
::
:: GIFAddHeader...
::
*/
function GIFAddHeader () {
$cmap = 0;
if (ord ($this->BUF [ 0 ] { 10 }) & 0x80) {
$cmap = 3 * (2 << (ord ($this->BUF [ 0 ] { 10 }) & 0x07));
$this->GIF .= substr ($this->BUF [ 0 ], 6, 7 );
$this->GIF .= substr ($this->BUF [ 0 ], 13, $cmap );
if($this->LOP !== false)
{
$this->GIF .= "!\377\13NETSCAPE2.0\3\1" . GIFEncoder::GIFWord ($this->LOP) . "\0";
}
}
}
/*
:::::::::::::::::::::::::::::::::::::::::::::::::::
::
:: GIFAddFrames...
::
*/
function GIFAddFrames ($i, $d) {
$Locals_str = 13 + 3 * (2 << (ord ($this->BUF [ $i ] { 10 }) & 0x07));
$Locals_end = strlen ($this->BUF [ $i ]) - $Locals_str - 1;
$Locals_tmp = substr ($this->BUF [ $i ], $Locals_str, $Locals_end);
$Global_len = 2 << (ord ($this->BUF [ 0 ] { 10 }) & 0x07);
$Locals_len = 2 << (ord ($this->BUF [ $i ] { 10 }) & 0x07);
$Global_rgb = substr ($this->BUF [ 0 ], 13,
3 * (2 << (ord ($this->BUF [ 0 ] { 10 }) & 0x07)));
$Locals_rgb = substr ($this->BUF [ $i ], 13,
3 * (2 << (ord ($this->BUF [ $i ] { 10 }) & 0x07)));
$Locals_ext = "!\xF9\x04" . chr (($this->DIS << 2) + 0) .
chr (($d >> 0) & 0xFF) . chr (($d >> 8) & 0xFF) . "\x0\x0";
if ($this->COL > -1 && ord ($this->BUF [ $i ] { 10 }) & 0x80) {
for ($j = 0; $j < (2 << (ord ($this->BUF [ $i ] { 10 }) & 0x07)); $j++) {
if (
ord ($Locals_rgb { 3 * $j + 0 }) == (($this->COL >> 16) & 0xFF) &&
ord ($Locals_rgb { 3 * $j + 1 }) == (($this->COL >> 8) & 0xFF) &&
ord ($Locals_rgb { 3 * $j + 2 }) == (($this->COL >> 0) & 0xFF)
) {
$Locals_ext = "!\xF9\x04" . chr (($this->DIS << 2) + 1) .
chr (($d >> 0) & 0xFF) . chr (($d >> 8) & 0xFF) . chr ($j) . "\x0";
break;
}
}
}
switch ($Locals_tmp { 0 }) {
case "!":
$Locals_img = substr ($Locals_tmp, 8, 10);
$Locals_tmp = substr ($Locals_tmp, 18, strlen ($Locals_tmp) - 18);
break;
case ",":
$Locals_img = substr ($Locals_tmp, 0, 10);
$Locals_tmp = substr ($Locals_tmp, 10, strlen ($Locals_tmp) - 10);
break;
}
if (ord ($this->BUF [ $i ] { 10 }) & 0x80 && $this->IMG > -1) {
if ($Global_len == $Locals_len) {
if (GIFEncoder::GIFBlockCompare ($Global_rgb, $Locals_rgb, $Global_len)) {
$this->GIF .= ($Locals_ext . $Locals_img . $Locals_tmp);
}
else {
/*
*
* XY Padding...
*
*/
if ($this->SIG == 1) {
$Locals_img { 1 } = chr ($this->OFS [ $i ] [ 0 ] & 0xFF);
$Locals_img { 2 } = chr (($$this->OFS [ $i ] [ 0 ] & 0xFF00) >> 8);
$Locals_img { 3 } = chr ($this->OFS [ $i ] [ 1 ] & 0xFF);
$Locals_img { 4 } = chr (($this->OFS [ $i ] [ 1 ] & 0xFF00) >> 8);
}
$byte = ord ($Locals_img { 9 });
$byte |= 0x80;
$byte &= 0xF8;
$byte |= (ord ($this->BUF [ 0 ] { 10 }) & 0x07);
$Locals_img { 9 } = chr ($byte);
$this->GIF .= ($Locals_ext . $Locals_img . $Locals_rgb . $Locals_tmp);
}
}
else {
/*
*
* XY Padding...
*
*/
if ($this->SIG == 1) {
$Locals_img { 1 } = chr ($this->OFS [ $i ] [ 0 ] & 0xFF);
$Locals_img { 2 } = chr (($$this->OFS [ $i ] [ 0 ] & 0xFF00) >> 8);
$Locals_img { 3 } = chr ($this->OFS [ $i ] [ 1 ] & 0xFF);
$Locals_img { 4 } = chr (($this->OFS [ $i ] [ 1 ] & 0xFF00) >> 8);
}
$byte = ord ($Locals_img { 9 });
$byte |= 0x80;
$byte &= 0xF8;
$byte |= (ord ($this->BUF [ $i ] { 10 }) & 0x07);
$Locals_img { 9 } = chr ($byte);
$this->GIF .= ($Locals_ext . $Locals_img . $Locals_rgb . $Locals_tmp);
}
}
else {
$this->GIF .= ($Locals_ext . $Locals_img . $Locals_tmp);
}
$this->IMG = 1;
}
/*
:::::::::::::::::::::::::::::::::::::::::::::::::::
::
:: GIFAddFooter...
::
*/
function GIFAddFooter () {
$this->GIF .= ";";
}
/*
:::::::::::::::::::::::::::::::::::::::::::::::::::
::
:: GIFBlockCompare...
::
*/
function GIFBlockCompare ($GlobalBlock, $LocalBlock, $Len) {
for ($i = 0; $i < $Len; $i++) {
if (
$GlobalBlock { 3 * $i + 0 } != $LocalBlock { 3 * $i + 0 } ||
$GlobalBlock { 3 * $i + 1 } != $LocalBlock { 3 * $i + 1 } ||
$GlobalBlock { 3 * $i + 2 } != $LocalBlock { 3 * $i + 2 }
) {
return (0);
}
}
return (1);
}
/*
:::::::::::::::::::::::::::::::::::::::::::::::::::
::
:: GIFWord...
::
*/
function GIFWord ($int) {
return (chr ($int & 0xFF) . chr (($int >> 8) & 0xFF));
}
/*
:::::::::::::::::::::::::::::::::::::::::::::::::::
::
:: GetAnimation...
::
*/
function GetAnimation () {
return ($this->GIF);
}
}
這篇文章有點兒老了,但我認爲這是值得一提給任何人認爲這將GIFEncoder.Class .php發佈者Danny是V3.00。如果您的版本低於3.00,則所提供的解決方案將無法工作。此外,從THIS頁面複製並粘貼課程將導致錯誤。所以你將不得不穀歌更新的類。祝你好運! – Partack