/** * @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); } } }
/** * @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)); }
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(); }
/** * @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; }