Version: 0.2
Type: Function
Category: Graphics
License: GNU General Public License
Description: This code will retrieve the size of an image stored in a Database as a BLOB. It uses a variable with the BLOB data in it to do it so and it will return a two element array with the width an height of that image. It has support for JPEG, GIF and PNG as well.
<?
/* Gnovus Networks & Software (TM)
Coded by: Joe666.
This simple function will return a two element array with the width and height of an image
from a database. The PHP function will get such data using a filename, but what if the
data is a BLOB field stored in a PHP variable ?. Well pass that variable as the parameter
of this function and it will return the following array:
dimensions[0] --> Image Width
dimensions[1] --> Image Height
This will get sizes just for GIF and JPEG files since that's all I need by now.
If you are able to correct,optimize or update in any form this code please let us
know at the following address:
joe666@gnovus.com
This code is free for you to use, copy or modify it in anywhere you want as long as you
do not remove our name from it. It is provided "as is" without any warranty so use it
at your own risk.
Hopefully you'll find it useful.
Gnovus Networks & Software.
www.gnovus.com
Mexico.
*/
/* May 7th, 2001.
We are now adding support for PNG Files
*/
/* Nov 23th, 2001
Now get resized images
By Jose Eduardo Mascarell Moreno. (jmascarell@linkz.es)
Linkz Multimedia.
www.linkz.es
Spain.
*/
function dbimagesize($photo)
{
//Verify it is a JPEG file
if(ord($photo[0]) == 255 && ord($photo[1]) == 216 && ord($photo[2]) == 255 && ord($photo[3]) == 224)
{
//If it is a JPEG file then retieve it's width and height
$i = 4; //Skip the JPEG header
do
{
$offset = (ord($photo[$i]) << 8) + (ord($photo[$i+1]));
for($j=0;$j<$offset && $i<strlen($photo);$j++,$i++);
if(ord($photo[$i]) == 255 && (ord($photo[$i+1]) & 240) == 192)
break;
$i+=2;
}while($i<strlen($photo));
$i+=5;
$width = ((ord($photo[$i+2]) << 8) + ord($photo[$i+3]));
$height = ((ord($photo[$i]) << 8) + ord($photo[$i+1]));
$dimensions[] = $width;
$dimensions[] = $height;
return $dimensions;
}
//Verify it is a GIF file
if(strcmp(substr($photo,0,3),"GIF") == 0)
{
//if it is GIF file then retrieve it's width and height
$width = ((ord($photo[7]) << 8) + ord($photo[6]));
$height = ((ord($photo[9]) << 8) + ord($photo[8]));
$dimensions[] = $width;
$dimensions[] = $height;
return $dimensions;
}
//Verify it is a PNG file
if(ord($photo[0]) == 137 && ord($photo[1]) == 80 && ord($photo[2]) == 78 &&
ord($photo[3]) == 71 && ord($photo[4]) == 13 && ord($photo[5]) == 10 &&
ord($photo[6]) == 26 && ord($photo[7]) == 10)
{
//Since the beginning of file contains the proper sequence of bytes then
//we have a PNG file. The next steps are:
//
// 1. Next 4 bytes are the size of the IHDR, this seems to always be 00 00 00 0D, skip them
// 2. Since 13 (0D) is the size of the IHDR, get the next 4 bytes (IHDR), this is the
// type of header.
// 3. Now get the Width of Image given by the following 4 bytes.
// 4. Finally get the next 4 bytes to retrieve the Height of the image
//Ok, skip the first 8 bytes, 4 bytes of Chunk size and 4 bytes of Chunk type
//that means we must begin at array position 16 to get the Width of file.
$width = ((ord($photo[16]) << 24)+(ord($photo[17]) << 16)+(ord($photo[18]) << 8)+(ord($photo[19])));
$height = ((ord($photo[20]) << 24)+(ord($photo[21]) << 16)+(ord($photo[22]) << 8)+(ord($photo[23])));
$dimensions[] = $width;
$dimensions[] = $height;
return $dimensions;
}
return false;
}
function resize_dbimagesize($photo,$const_resize)
/*
This function is useful to get the images resized.
$const_resize --> Define the max size (width or heigth) of the image.
Autor: Jose Ed. Mascarell Moreno
E-mail:jmascarell@linz.es
Linkz Multimedia www.linkz.es
Valencia (Spain)
*/
{
//Verify it is a JPEG file
if(ord($photo[0]) == 255 && ord($photo[1]) == 216 && ord($photo[2]) == 255 && ord($photo[3]) == 224)
{
//If it is a JPEG file then retieve it's width and height
$i = 4; //Skip the JPEG header
do
{
$offset = (ord($photo[$i]) << 8) + (ord($photo[$i+1]));
for($j=0;$j<$offset && $i<strlen($photo);$j++,$i++);
if(ord($photo[$i]) == 255 && (ord($photo[$i+1]) & 240) == 192)
break;
$i+=2;
}while($i<strlen($photo));
$i+=5;
$width = ((ord($photo[$i+2]) << 8) + ord($photo[$i+3]));
$height = ((ord($photo[$i]) << 8) + ord($photo[$i+1]));
/* Code added by Jose Ed. Mascarell Moreno
jmascarell@linkz.es.
*/
$dimensions[] = $width;
$dimensions[] = $height;
if ($dimensions[0]>=$dimensions[1]){
$dimensions[1]=$dimensions[1]/($dimensions[0]/$const_resize);
$dimensions[0]=$const_resize;}
else{
$dimensions[0]=$dimensions[0]/($dimensions[1]/$const_resize);
$dimensions[1]=$const_resize;
}
/* End Added Code */
return $dimensions;
}
//Verify it is a GIF file
if(strcmp(substr($photo,0,3),"GIF") == 0)
{
//if it is GIF file then retrieve it's width and height
$width = ((ord($photo[7]) << 8) + ord($photo[6]));
$height = ((ord($photo[9]) << 8) + ord($photo[8]));
$dimensions[] = $width;
$dimensions[] = $height;
/* Code added by Jose Ed. Mascarell Moreno
jmascarell@linkz.es.
*/
if ($dimensions[0]>=$dimensions[1]){
$dimensions[1]=$dimensions[1]/($dimensions[0]/$const_resize);
$dimensions[0]=$const_resize;}
else{
$dimensions[0]=$dimensions[0]/($dimensions[1]/$const_resize);
$dimensions[1]=$const_resize;
}
/* End Added Code */
return $dimensions;
}
//Verify it is a PNG file
if(ord($photo[0]) == 137 && ord($photo[1]) == 80 && ord($photo[2]) == 78 &&
ord($photo[3]) == 71 && ord($photo[4]) == 13 && ord($photo[5]) == 10 &&
ord($photo[6]) == 26 && ord($photo[7]) == 10)
{
//Since the beginning of file contains the proper sequence of bytes then
//we have a PNG file. The next steps are:
//
// 1. Next 4 bytes are the size of the IHDR, this seems to always be 00 00 00 0D, skip them
// 2. Since 13 (0D) is the size of the IHDR, get the next 4 bytes (IHDR), this is the
// type of header.
// 3. Now get the Width of Image given by the following 4 bytes.
// 4. Finally get the next 4 bytes to retrieve the Height of the image
//Ok, skip the first 8 bytes, 4 bytes of Chunk size and 4 bytes of Chunk type
//that means we must begin at array position 16 to get the Width of file.
$width = ((ord($photo[16]) << 24)+(ord($photo[17]) << 16)+(ord($photo[18]) << 8)+(ord($photo[19])));
$height = ((ord($photo[20]) << 24)+(ord($photo[21]) << 16)+(ord($photo[22]) << 8)+(ord($photo[23])));
$dimensions[] = $width;
$dimensions[] = $height;
/* Code added by Jose Ed. Mascarell Moreno
jmascarell@linkz.es.
*/
if ($dimensions[0]>=$dimensions[1]){
$dimensions[1]=$dimensions[1]/($dimensions[0]/$const_resize);
$dimensions[0]=$const_resize;}
else{
$dimensions[0]=$dimensions[0]/($dimensions[1]/$const_resize);
$dimensions[1]=$const_resize;
}
/* End Added Code */
return $dimensions;
}
return false;
}
?>