Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- namespace Core\Image;
- class Getimagesize {
- private $strpos = 0;
- private $str;
- private $uri;
- private $type;
- private $handle;
- public function __construct($uri = null) {
- if ($uri)
- $this->load ( $uri );
- }
- public function load($uri) {
- if ($this->handle)
- $this->close ();
- $this->uri = $uri;
- $this->handle = @fopen ( $uri, 'r' );
- }
- public function close() {
- if ($this->handle)
- fclose ( $this->handle );
- }
- public function getSize() {
- $this->strpos = 0;
- if ($this->getType ()) {
- return $this->parseSize ();
- }
- return false;
- }
- public function getType() {
- $this->strpos = 0;
- if (! $this->type) {
- switch ($this->getChars ( 2 )) {
- case "BM" :
- return $this->type = 'bmp';
- case "GI" :
- return $this->type = 'gif';
- case chr ( 0xFF ) . chr ( 0xd8 ) :
- return $this->type = 'jpeg';
- case chr ( 0x89 ) . 'P' :
- return $this->type = 'png';
- default :
- return false;
- }
- }
- return $this->type;
- }
- private function parseSize() {
- $this->strpos = 0;
- switch ($this->type) {
- case 'png' :
- $info = $this->parseSizeForPNG ();
- if ($info) {
- $info = array (
- $info [1],
- $info [2],
- 3,
- 'width="' . $info [1] . '" height="' . $info [2] . '"',
- 'bits' => 8,
- 'mime' => 'image/png'
- );
- }
- return $info;
- case 'gif' :
- $info = $this->parseSizeForGIF ();
- if ($info) {
- $info = array (
- $info [1],
- $info [2],
- 1,
- 'width="' . $info [1] . '" height="' . $info [2] . '"',
- 'bits' => 8,
- 'mime' => 'image/gif'
- );
- }
- return $info;
- case 'bmp' :
- $info = $this->parseSizeForBMP ();
- if ($info) {
- $info = array (
- $info [1],
- $info [2],
- 6,
- 'width="' . $info [1] . '" height="' . $info [2] . '"',
- 'bits' => 8,
- 'mime' => 'image/x-ms-bmp'
- );
- }
- return $info;
- case 'jpeg' :
- $info = $this->parseSizeForJPEG ();
- if ($info) {
- $info = array (
- $info [0],
- $info [1],
- 2,
- 'width="' . $info [0] . '" height="' . $info [1] . '"',
- 'bits' => 8,
- 'mime' => 'image/jpeg'
- );
- }
- return $info;
- }
- return null;
- }
- private function parseSizeForPNG() {
- $chars = $this->getChars ( 25 );
- return unpack ( "N*", substr ( $chars, 16, 8 ) );
- }
- private function parseSizeForGIF() {
- $chars = $this->getChars ( 11 );
- return unpack ( "S*", substr ( $chars, 6, 4 ) );
- }
- private function parseSizeForBMP() {
- $chars = $this->getChars ( 29 );
- $chars = substr ( $chars, 14, 14 );
- $type = unpack ( 'C', $chars );
- return (reset ( $type ) == 40) ? unpack ( 'L*', substr ( $chars, 4 ) ) : unpack ( 'L*', substr ( $chars, 4, 8 ) );
- }
- private function parseSizeForJPEG() {
- $state = null;
- $i = 0;
- while ( true ) {
- switch ($state) {
- default :
- $this->getChars ( 2 );
- $state = 'started';
- break;
- case 'started' :
- $b = $this->getByte ();
- if ($b === false)
- return false;
- $state = $b == 0xFF ? 'sof' : 'started';
- break;
- case 'sof' :
- $b = $this->getByte ();
- if (in_array ( $b, range ( 0xe0, 0xef ) )) {
- $state = 'skipframe';
- } elseif (in_array ( $b, array_merge ( range ( 0xC0, 0xC3 ), range ( 0xC5, 0xC7 ), range ( 0xC9, 0xCB ), range ( 0xCD, 0xCF ) ) )) {
- $state = 'readsize';
- } elseif ($b == 0xFF) {
- $state = 'sof';
- } else {
- $state = 'skipframe';
- }
- break;
- case 'skipframe' :
- $skip = $this->readInt ( $this->getChars ( 2 ) ) - 2;
- $state = 'doskip';
- break;
- case 'doskip' :
- $this->getChars ( $skip );
- $state = 'started';
- break;
- case 'readsize' :
- $c = $this->getChars ( 7 );
- return array (
- $this->readInt ( substr ( $c, 5, 2 ) ),
- $this->readInt ( substr ( $c, 3, 2 ) )
- );
- }
- }
- }
- private function getChars($n) {
- if (! $this->handle)
- return false;
- $response = null;
- // do we need more data?
- if ($this->strpos + $n - 1 >= strlen ( $this->str )) {
- $end = ($this->strpos + $n);
- while ( strlen ( $this->str ) < $end && $response !== false ) {
- // read more from the file handle
- $need = $end - ftell ( $this->handle );
- if ($response = fread ( $this->handle, $need )) {
- $this->str .= $response;
- } else {
- return false;
- }
- }
- }
- $result = substr ( $this->str, $this->strpos, $n );
- $this->strpos += $n;
- // we are dealing with bytes here, so force the encoding
- return mb_convert_encoding ( $result, "8BIT" );
- }
- private function getByte() {
- $c = $this->getChars ( 1 );
- $b = unpack ( "C", $c );
- return reset ( $b );
- }
- private function readInt($str) {
- $size = unpack ( "C*", $str );
- return ($size [1] << 8) + $size [2];
- }
- public function __destruct() {
- $this->close ();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement