2012-11-02 39 views
2

我正在使用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); 
    } 
} 
+1

這篇文章有點兒老了,但我認爲這是值得一提給任何人認爲這將GIFEncoder.Class .php發佈者Danny是V3.00。如果您的版本低於3.00,則所提供的解決方案將無法工作。此外,從THIS頁面複製並粘貼課程將導致錯誤。所以你將不得不穀歌更新的類。祝你好運! – Partack

回答

1

找到了解決辦法...只要迴路設置爲假

0

這個類有錯誤。請更換所有「$$這個 - > OFS」到「$這個 - > OFS

$gif = new GIFEncoder (

    // 1. frames 
    array('1.gif', '2.gif', '3.gif'), 

    // 2. speed - array for frames or number 
    //array(500,500,500), 
    20, 

    // 3. loops - number or false 
    0, 

    // 4. disposal ??? - what is it? 
    2, 

    // 5-7. transparent RGB 
    0,0,0, 

    // 8. padding array with point(x,y) or 0 
    array(
     array(0,50), 
     array(0,0) 
    ), 

    // 9. source 'url' or 'bin' 
    "url" 
);