/** * @param FileHandler $fh */ public function decode($fh) { $fh->seekForward(1); $this->screenLeftPos = $fh->readUint16(); $this->screenTopPos = $fh->readUint16(); $this->screenWidth = $fh->readUint16(); $this->screenHeight = $fh->readUint16(); $packedFields = ord($fh->readByte()); $this->colorTableFlag = ($packedFields & 0x80) > 0; $this->interlaceFlag = ($packedFields & 0x40) > 0; $this->sortFlag = ($packedFields & 0x20) > 0; $this->reserved = ($packedFields & 0x18) >> 3; $ctSize = $packedFields & 0x7; $this->colorTableSize = pow(2, $ctSize + 1); $this->colorTable = ""; if ($this->colorTableFlag && $this->colorTableSize > 0) { $this->colorTable = $fh->readData($this->colorTableSize * 3); } // Here comes the image frame: $this->lzwMinCodeSize = $fh->readByte(); // After the Min Code Size, the LZW stream behaves similarly to the data sub-blocks, and the data will be stored in that variable. $this->readDataSubBlocks($fh); // Spool past the \x00 terminator byte. There *should* only be one. while ($fh->peekByte() == "") { $fh->seekForward(1); } }
/** * @param FileHandler $fh */ public function decode($fh) { $fh->seekForward(1); // skip block label. $this->blockLength = $fh->readByteUint(); // 12 $this->textGridLeftPosition = $fh->readUint16(); $this->textGridTopPosition = $fh->readUint16(); $this->textGridWidth = $fh->readUint16(); $this->textGridHeight = $fh->readUint16(); $this->characterCellWidth = $fh->readByteUint(); $this->characterCellHeight = $fh->readByteUint(); $this->textFGColorIndex = $fh->readByteUint(); $this->textBGColorIndex = $fh->readByteUint(); $this->readDataSubBlocks($fh); // Spool past the \x00 terminator byte. There *should* only be one. while ($fh->peekByte() == "") { $fh->seekForward(1); } }
/** * @param FileHandler $fh * * @throws Exception */ public function decode($fh) { if ($fh->getRemainingBytes() < 7) { throw new Exception("Insufficient data. Need 7 bytes, got " . $fh->getRemainingBytes()); } $this->screenWidth = $fh->readUint16(); $this->screenHeight = $fh->readUint16(); $packedFields = ord($fh->readByte()); $this->colorTableFlag = ($packedFields & 0x80) > 0; $this->colorResolution = ($packedFields & 0x70) >> 4; $this->sortFlag = ($packedFields & 0x8) > 0; // For just 8 possible values, the lookup table is faster. // the commented lines below is the pedantic way of doing it. // $v = ($packedFields & 0x07); // $this->colorTableSize = pow(2, $v + 1); $this->colorTableSize = $this->ctSizeListRev[$packedFields & 0x7]; $this->bgColorIndex = $fh->readByteUint(); $v = $fh->readByteUint(); $this->pixelAspectRatio = $v > 0 ? ($v + 15) / 64 : 0; if ($this->colorTableFlag && $this->colorTableSize > 0) { $this->colorTable = $fh->readData($this->colorTableSize * 3); } }
/** * @param FileHandler $fh */ public function decode($fh) { $fh->seekForward(1); // skip block label. $this->blockLength = $fh->readByteUint(); // 4 $packedFields = $fh->readByteUint(); $this->reserved = ($packedFields & 0x70) >> 5; $this->disposalMethod = ($packedFields & 0x1c) >> 2; $this->userInputFlag = ($packedFields & 0x2) > 0; $this->transparentColorFlag = ($packedFields & 0x1) > 0; $this->delayTime = $fh->readUint16(); $this->transparentColorIndex = $fh->readByteUint(); // Spool past the \x00 terminator byte. There *should* only be one. while ($fh->compareByte("")) { $fh->readByte(); } // The GCE will always be followed by the Image Descriptor. $this->imageDescriptor = new ImageDescriptor($fh); $this->imageDescriptor->parentGCE = $this; }
/** * @param string $file * * @return array with "width" and "height" of the gif file. * @throws Exception */ public static function getSize($file) { $fh = new FileHandler(); try { $fh->openFile($file); } catch (Exception $e) { throw $e; } $header = new Header($fh); if ($header->signature !== "GIF" && $header->version !== "87a" && $header->version !== "89a") { $fh->closeFile(); throw new Exception("Not a gif file."); } $size = array("width" => $fh->readUint16(), "height" => $fh->readUint16()); $fh->closeFile(); return $size; }