Пример #1
0
 /**
  * @param FileHandler             $fh
  * @param LogicalScreenDescriptor $lsd
  * @param string                  $dstPath
  */
 private static function processGifStream($fh, $lsd, $dstPath)
 {
     $frameCount = 0;
     while (!$fh->isEOF()) {
         switch (ord($fh->peekByte())) {
             case AbstractExtensionBlock::CONTROL_EXTENSION:
                 self::readExtensionBlock($fh, $frameCount, $lsd, $dstPath);
                 break;
             case AbstractExtensionBlock::CONTROL_IMAGE:
                 $idb = new ImageDescriptor($fh);
                 self::writeFrame($dstPath, $frameCount, $lsd, $idb);
                 break;
             case AbstractExtensionBlock::CONTROL_TRAILER:
                 $fh->seekForward(1);
                 break;
             case AbstractExtensionBlock::CONTROL_TERMINATOR:
                 $fh->seekForward(1);
                 break;
             default:
                 $fh->seekForward(1);
         }
     }
 }
Пример #2
0
 /**
  * @param FileHandler             $fh
  * @param FileHandler             $fhW
  * @param float                   $ratio
  * @param LogicalScreenDescriptor $lsd
  */
 private static function processGifStream($fh, $fhW, $ratio, $lsd)
 {
     while (!$fh->isEOF()) {
         switch (ord($fh->peekByte())) {
             case AbstractExtensionBlock::CONTROL_EXTENSION:
                 self::readExtensionBlock($fh, $fhW, $ratio, $lsd);
                 break;
             case AbstractExtensionBlock::CONTROL_IMAGE:
                 $idb = new ImageDescriptor($fh);
                 $idb->resize($ratio, $lsd);
                 $idb->encodeToFile($fhW);
                 break;
             case AbstractExtensionBlock::CONTROL_TRAILER:
                 $fh->seekForward(1);
                 break;
             case AbstractExtensionBlock::CONTROL_TERMINATOR:
                 $fh->seekForward(1);
                 break;
             default:
                 $fh->seekForward(1);
         }
     }
     $fhW->writeData(chr(AbstractExtensionBlock::CONTROL_TRAILER));
 }
Пример #3
0
 public static function dumpGif($file, $dstDir = null, $dstFilePrefix = null)
 {
     $fh = new FileHandler();
     $frameCount = 0;
     echo "Reading '{$file}'\n";
     try {
         $fh->openFile($file);
     } catch (Exception $e) {
         echo 'Caught exception: ', $e->getMessage(), "\n";
         exit;
     }
     echo "\n\n------------------------------------------------------------------------\n";
     echo "--- HEADER\n";
     echo "------------------------------------------------------------------------\n\n";
     $header = new Header($fh);
     self::dumpHeader($header);
     if ($header->signature !== "GIF" && $header->version !== "87a" && $header->version !== "89a") {
         $fh->closeFile();
         throw new Exception("Not a gif file.");
     }
     $dstPath = null;
     if ($dstDir != null) {
         $dstDir = str_replace("\\", "/", $dstDir);
         if ($dstFilePrefix == null) {
             $dstFilePrefix = basename($file, '.gif');
         }
         $lc = substr($dstDir, -1);
         if ("/" !== $lc) {
             $dstDir .= "/";
         }
         $dstPath = $dstDir . $dstFilePrefix . "_";
     }
     echo "\n\n------------------------------------------------------------------------\n";
     echo "--- LOGICAL SCREEN DESCTIPTOR\n";
     echo "------------------------------------------------------------------------\n\n";
     $lsd = new LogicalScreenDescriptor($fh);
     self::dumpLogicalScreenDescriptor($lsd);
     while (!$fh->isEOF()) {
         switch (ord($fh->peekByte())) {
             case AbstractExtensionBlock::CONTROL_EXTENSION:
                 echo "\n\n------------------------------------------------------------------------\n";
                 echo "--- EXTENSION BLOCK\n";
                 echo "------------------------------------------------------------------------\n\n";
                 self::dumpExtensionBlock($fh, $frameCount, $lsd, $dstPath);
                 break;
             case AbstractExtensionBlock::CONTROL_IMAGE:
                 $frameCount++;
                 echo "\n\n------------------------------------------------------------------------\n";
                 echo "--- FRAME " . $frameCount . "\n";
                 echo "------------------------------------------------------------------------\n\n";
                 $idb = new ImageDescriptor($fh);
                 self::dumpImageDescriptor($idb);
                 self::writeFrame($dstPath, $frameCount, $lsd, $idb);
                 break;
             case AbstractExtensionBlock::CONTROL_TRAILER:
                 echo "\n\n------------------------------------------------------------------------\n";
                 echo "--- TRAILER FOUND - END OF IMAGE.\n";
                 echo "--- FRAMES " . $frameCount . "\n";
                 echo "------------------------------------------------------------------------\n\n";
                 $fh->seekForward(1);
                 break;
             case AbstractExtensionBlock::CONTROL_TERMINATOR:
                 $fh->seekForward(1);
                 break;
             default:
                 $c = $fh->readByte();
                 echo "\n\n------------------------------------------------------------------------\n";
                 echo "--- UNKNOWN CODE: 0x" . bin2hex($c) . " (" . ord($c) . ")\n";
                 echo "------------------------------------------------------------------------\n\n";
         }
     }
     echo "\n";
     $fh->closeFile();
 }
Пример #4
0
 /**
  * @param FileHandler             $fh
  * @param GraphicControlExtension $gce
  *
  * @return ImageDescriptor|GraphicControlExtension
  */
 public static function getFirstImageFrame($fh, $gce = null)
 {
     $nId = null;
     while ($nId == null && !$fh->isEOF()) {
         $blockLabel = $fh->peekByte();
         if (ord($blockLabel) == AbstractExtensionBlock::CONTROL_IMAGE) {
             $nId = new ImageDescriptor($fh);
             if ($gce != null) {
                 $gce->transparentColorFlag = false;
                 $gce->transparentColorIndex = 0;
             }
             return $nId;
         } else {
             if (ord($blockLabel) == AbstractExtensionBlock::CONTROL_EXTENSION) {
                 $fh->seekForward(1);
                 $blockLabel = $fh->peekByte();
                 if (ord($blockLabel) == AbstractExtensionBlock::LABEL_GRAPHICS_CONTROL) {
                     $nGce = new GraphicControlExtension($fh);
                     if ($gce != null) {
                         $gce->transparentColorFlag = $nGce->transparentColorFlag;
                         $gce->transparentColorIndex = $nGce->transparentColorIndex;
                     }
                     return $nGce;
                 }
             }
         }
     }
     return null;
 }