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 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