<?php
/////////////////////////////////////////////////////////////////
/// getID3() by James Heinrich <getid3@users.sourceforge.net>  //
//        available at http://getid3.sourceforge.net          ///
/////////////////////////////////////////////////////////////////
//                                                             //
// getid3.getimagesize.php - part of getID3()                  //
// See getid3.readme.txt for more details                      //
//                                                             //
/////////////////////////////////////////////////////////////////
// GetURLImageSize( $urlpic ) determines the                   //
// dimensions of local/remote URL pictures.                    //
// returns array with ($width, $height, $type)                 //
//                                                             //
// Thanks to: Oyvind Hallsteinsen aka Gosub / ELq -            //
// gosub@elq.org  for the original size determining code       //
//                                                             //
// PHP Hack by Filipe Laborde-Basto Oct 21/2000                //
// FREELY DISTRIBUTABLE -- use at your sole discretion! :)     //
// Enjoy. (Not to be sold in commercial packages though,       //
// keep it free!) Feel free to contact me at fil@rezox.com     //
// (http://www.rezox.com)                                      //
//                                                             //
// Modified by James Heinrich <getid3@users.sourceforge.net>   //
// June 1, 2001 - created GetDataImageSize($imgData) by        //
// seperating the fopen() stuff to GetURLImageSize($urlpic)    //
// which then calls GetDataImageSize($imgData). The idea being //
// you can call GetDataImageSize($imgData) with image data     //
// from a database etc.                                        //
//                                                             //
/////////////////////////////////////////////////////////////////

define('GIF_SIG',     chr(0x47).chr(0x49).chr(0x46));  // 'GIF'

define('PNG_SIG',     chr(0x89).chr(0x50).chr(0x4E).chr(0x47).chr(0x0D).chr(0x0A).chr(0x1A).chr(0x0A));

define('JPG_SIG',     chr(0xFF).chr(0xD8).chr(0xFF));
define('JPG_SOS',     chr(0xDA)); // Start Of Scan - image data start
define('JPG_SOF0',    chr(0xC0)); // Start Of Frame N
define('JPG_SOF1',    chr(0xC1)); // N indicates which compression process
define('JPG_SOF2',    chr(0xC2)); // Only SOF0-SOF2 are now in common use
define('JPG_SOF3',    chr(0xC3));
// NB: codes C4 and CC are *not* SOF markers
define('JPG_SOF5',    chr(0xC5));
define('JPG_SOF6',    chr(0xC6));
define('JPG_SOF7',    chr(0xC7));
define('JPG_SOF9',    chr(0xC9));
define('JPG_SOF10',   chr(0xCA));
define('JPG_SOF11',   chr(0xCB));
// NB: codes C4 and CC are *not* SOF markers
define('JPG_SOF13',   chr(0xCD));
define('JPG_SOF14',   chr(0xCE));
define('JPG_SOF15',   chr(0xCF));
define('JPG_EOI',     chr(0xD9)); // End Of Image (end of datastream)


function GetURLImageSize($urlpic) {
	if ($fd = @fopen($urlpic, 'rb')){
		$imgData = fread($fd, filesize($urlpic));
		fclose($fd);
		return GetDataImageSize($imgData);
	} else {
		return array('', '', '');
	}
}


function GetDataImageSize($imgData) {
	$height = '';
	$width  = '';
	$type   = '';
	if ((substr($imgData, 0, 3) == GIF_SIG) && (strlen($imgData) > 10)) {
		$dim = unpack('v2dim', substr($imgData, 6, 4));
		$width  = $dim['dim1'];
		$height = $dim['dim2'];
		$type = 1;
	} elseif ((substr($imgData, 0, 8) == PNG_SIG) && (strlen($imgData) > 24)) {
		$dim = unpack('N2dim', substr($imgData, 16, 8));
		$width  = $dim['dim1'];
		$height = $dim['dim2'];
		$type = 3;
	} elseif ((substr($imgData, 0, 3) == JPG_SIG) && (strlen($imgData) > 4)) {
		///////////////// JPG CHUNK SCAN ////////////////////
		$imgPos = 2;
		$type = 2;
		$buffer = strlen($imgData) - 2;
		while ($imgPos < strlen($imgData)) {
			// synchronize to the marker 0xFF
			$imgPos = strpos($imgData, 0xFF, $imgPos) + 1;
			$marker = $imgData[$imgPos];
			do {
				$marker = ord($imgData[$imgPos++]);
			} while ($marker == 255);
			// find dimensions of block
			switch (chr($marker)) {
				// Grab width/height from SOF segment (these are acceptable chunk types)
				case JPG_SOF0:
				case JPG_SOF1:
				case JPG_SOF2:
				case JPG_SOF3:
				case JPG_SOF5:
				case JPG_SOF6:
				case JPG_SOF7:
				case JPG_SOF9:
				case JPG_SOF10:
				case JPG_SOF11:
				case JPG_SOF13:
				case JPG_SOF14:
				case JPG_SOF15:
					$dim = unpack('n2dim', substr($imgData, $imgPos + 3, 4));
					$height = $dim['dim1'];
					$width  = $dim['dim2'];
					break 2; // found it so exit
				case JPG_EOI:
				case JPG_SOS:
					return false;       // End loop in case we find one of these markers
				default:            // We're not interested in other markers
					$skiplen = (ord($imgData[$imgPos++]) << 8) + ord($imgData[$imgPos++]) - 2;
					// if the skip is more than what we've read in, read more
					$buffer -= $skiplen;
					if ($buffer < 512) { // if the buffer of data is too low, read more file.
						// $imgData .= fread( $fd,$skiplen+1024 );
						// $buffer += $skiplen + 1024;
						return false; // End loop in case we find run out of data
					}
					$imgPos += $skiplen;
					break;
			} // endswitch check marker type
		} // endif loop through JPG chunks
	} // endif chk for valid file types

	return array($width, $height, $type);
} // end function


function ImageTypesLookup($imagetypeid) {
	static $ImageTypesLookup = array();
	if (empty($ImageTypesLookup)) {
		$ImageTypesLookup[1]  = 'gif';
		$ImageTypesLookup[2]  = 'jpg';
		$ImageTypesLookup[3]  = 'png';
		$ImageTypesLookup[4]  = 'swf';
		$ImageTypesLookup[5]  = 'psd';
		$ImageTypesLookup[6]  = 'bmp';
		$ImageTypesLookup[7]  = 'tiff (little-endian)';
		$ImageTypesLookup[8]  = 'tiff (big-endian)';
		$ImageTypesLookup[9]  = 'jpc';
		$ImageTypesLookup[10] = 'jp2';
		$ImageTypesLookup[11] = 'jpx';
		$ImageTypesLookup[12] = 'jb2';
		$ImageTypesLookup[13] = 'swc';
		$ImageTypesLookup[14] = 'iff';
	}
	return (isset($ImageTypesLookup[$imagetypeid]) ? $ImageTypesLookup[$imagetypeid] : '');
}

?>