PHP: Get the width and height of an image.
In this tutorial, I will be showing you how to get the width and height of an image using PHP. Thankfully, PHP has a handy built-in function called getimagesize, which will do most of the tough work for us.
Let’s look at a simple example:
//The path and filename of our image. $imagePath = 'image.png'; //Use getimagesize to get size info about the image. $sizeInfo = getimagesize($imagePath); //Check to see if it was successful. if($sizeInfo === false) < //Throw an exception if the function failed. throw new Exception('Could not get image size of: ' . $imagePath); >//var_dump the array that getimagesize returned. var_dump($sizeInfo);
In the code snippet above:
- We specified the path to our image file. In this case, the code assumes that the file is in the same directory as our PHP script. If it is in a different location, you will need to specify the full or relative path.
- We retrieved the size of the image using the function getimagesize. This function will return an array or a boolean FALSE value on failure.
- After that, we check to see if the function has failed or not. If it fails, we throw an Exception.
- If the function was successful, we var_dump the array that was returned so that we can get a better look at its structure.
Getting the dimensions.
In my case, the array looked like this:
As you can see, there are six elements in the array:
- 0: This is the width of the image in pixels.
- 1: This is the height of the image in pixels.
- 2: An integer value that tells us what type of image it is. The integer in question corresponds to one of the IMAGETYPE_* constants. In the case above, the type of image corresponds to IMAGETYPE_PNG (3). Similarly, if it were a JPEG, this element would contain 2, which corresponds to IMAGETYPE_JPEG.
- 3: This is a HTML string that contains the inline width and height of the image. To be honest, this isn’t really that useful as we can build the string ourselves using the dimensions in the first two elements.
- bits: The number of bits for each color.
- mime: The mime type of the image.
Taking the above information into account, you can print out the dimensions of the image like so:
//Printing out width X height. echo $sizeInfo[0] . ' X ' . $sizeInfo[1];
In my case, PHP printed out “272 X 92” onto the page.
WebP files.
Support for Google’s WebP format was not added until PHP version 7.1. As a result, the getimagesize function will return a boolean FALSE value if you are using an earlier version than that.
ico files.
Furthermore, .ico files may also fail as PHP only added support for icon files version 5.3.
Can getimagesize be used to validate image files?
This is not recommended, as the getimagesize function does not attempt to validate the format of the image. In the past, I have come across examples that showed how a GIF file containing PHP code was accepted by the function.
Failed to open stream.
If you receive a “failed to open stream” warning, then it means that geimagesize was unable to locate the file that you gave it. To fix this, you will need to make sure that the path you specified is correct.
GD and Image Functions
The image sharpen function (by Alex R. Austin) provided below seems to be very resource hungry and I couldn’t make it work on two different servers — trying to sharpen a 413 x 413 image I ended up with «Fatal error: Allowed memory size of 8388608 bytes exhausted» or «Internal Server Error» or the script terminated without notice. Because I had no priviliges to change the default memory limit on these servers I started looking for other sharpen functions. I have come across a php Unsharp Mask function which works like a charm on both of the servers I dealt with. It can be found at http://vikjavev.no/hovudsida/umtestside.php.
Representation decimal of a color in hexadecimal for use on functions of library GD.
// Representation hexadecimal
$var = ‘#FFFFFF’ ;
function getRgbFromGd ( $color_hex )
return array_map ( ‘hexdec’ , explode ( ‘|’ , wordwrap ( substr ( $color_hex , 1 ), 2 , ‘|’ , 1 )));
print_r ( getRgbFromGd ( $var ));
// Output: Array ( [0] => 255 [1] => 255 [2] => 255 )
If you happen to need a way to output a Windows BMP file (e.g. when using the PEAR ExcelWriter), feel free to use the following code:
function imagebmp ( $im , $fn = false )
if (! $im ) return false ;
if ( $fn === false ) $fn = ‘php://output’ ;
$f = fopen ( $fn , «w» );
if (! $f ) return false ;
//Image dimensions
$biWidth = imagesx ( $im );
$biHeight = imagesy ( $im );
$biBPLine = $biWidth * 3 ;
$biStride = ( $biBPLine + 3 ) & ~ 3 ;
$biSizeImage = $biStride * $biHeight ;
$bfOffBits = 54 ;
$bfSize = $bfOffBits + $biSizeImage ;
//BITMAPFILEHEADER
fwrite ( $f , ‘BM’ , 2 );
fwrite ( $f , pack ( ‘VvvV’ , $bfSize , 0 , 0 , $bfOffBits ));
//BITMAPINFO (BITMAPINFOHEADER)
fwrite ( $f , pack ( ‘VVVvvVVVVVV’ , 40 , $biWidth , $biHeight , 1 , 24 , 0 , $biSizeImage , 0 , 0 , 0 , 0 ));
$numpad = $biStride — $biBPLine ;
for ( $y = $biHeight — 1 ; $y >= 0 ; — $y )
for ( $x = 0 ; $x < $biWidth ; ++ $x )
$col = imagecolorat ( $im , $x , $y );
fwrite ( $f , pack ( ‘V’ , $col ), 3 );
>
for ( $i = 0 ; $i < $numpad ; ++ $i )
fwrite ( $f , pack ( ‘C’ , 0 ));
>
fclose ( $f );
return true ;
>
?>
It works the same way as regular imagejpeg/imagepng do and only supports GD2.0 true colour bitmaps (which is what’s required by ExcelWriter).
I wrote a simple function to convert an image resource to PGM (portable graymap) in order to feed it to an OCR program. It works just like the rest of the image output functions, and will convert to grayscale for you:
function imagepgm ( $image , $filename = null )
$pgm = «P5 » . imagesx ( $image ). » » . imagesy ( $image ). » 255\n» ;
for( $y = 0 ; $y < imagesy ( $image ); $y ++)
for( $x = 0 ; $x < imagesx ( $image ); $x ++)
$colors = imagecolorsforindex ( $image , imagecolorat ( $image , $x , $y ));
$pgm .= chr ( 0.3 * $colors [ «red» ] + 0.59 * $colors [ «green» ] + 0.11 * $colors [ «blue» ]);
>
>
if( $filename != null )
$fp = fopen ( $filename , «w» );
fwrite ( $fp , $pgm );
fclose ( $fp );
>
else
return $pgm ;
>
>
?>
I know this might look somewhat superfluous to others, but i once came across a situation where i needed a *strong* blur on an image without having ImageMagick installed. Executing the convolution-filter several times on the same image is awfully slow and still doesn’t give a good blur.
The function below accepts a truecolor-image and a blur-factor between 0.0 and 1.0. Beware: It’s still quite slow.
function blurImage ( $srcimg , $blur )
$blur = $blur * $blur ;
$blur = max ( 0 , min ( 1 , $blur ));
$srcw = imagesx ( $srcimg );
$srch = imagesy ( $srcimg );
$dstimg = imagecreatetruecolor ( $srcw , $srch );
$cr = 0 ; $cg = 0 ; $cb = 0 ;
$nr = 0 ; $ng = 0 ; $nb = 0 ;
$rgb = imagecolorat ( $srcimg , 0 , 0 );
$or = ( $rgb >> 16 ) & 0xFF ;
$og = ( $rgb >> 8 ) & 0xFF ;
$ob = ( $rgb ) & 0xFF ;
$nr = ( $cr * $f1a ) + ( $or * $f1b );
$ng = ( $cg * $f1a ) + ( $og * $f1b );
$nb = ( $cb * $f1a ) + ( $ob * $f1b );
$rgb = imagecolorat ( $srcimg , 0 , $y );
$or = ( $rgb >> 16 ) & 0xFF ;
$og = ( $rgb >> 8 ) & 0xFF ;
$ob = ( $rgb ) & 0xFF ;
$x = $srcw ;
while ( $x —)
//horizontal
$rgb = imagecolorat ( $srcimg , $x , $y );
$cr = ( $rgb >> 16 ) & 0xFF ;
$cg = ( $rgb >> 8 ) & 0xFF ;
$cb = ( $rgb ) & 0xFF ;
$nr = ( $cr * $f1a ) + ( $or * $f1b );
$ng = ( $cg * $f1a ) + ( $og * $f1b );
$nb = ( $cb * $f1a ) + ( $ob * $f1b );
//vertical
$rgb = imagecolorat ( $dstimg , $x , $y + 1 );
$vr = ( $rgb >> 16 ) & 0xFF ;
$vg = ( $rgb >> 8 ) & 0xFF ;
$vb = ( $rgb ) & 0xFF ;
$nr = ( $nr * $f1a ) + ( $vr * $f1b );
$ng = ( $ng * $f1a ) + ( $vg * $f1b );
$nb = ( $nb * $f1a ) + ( $vb * $f1b );
$srcimg = imagecreatefromjpeg ( «test.jpg» );
$dstimg = blurImage ( $srcimg , 0.2 );
header ( ‘Content-type: image/jpeg’ );
echo( imagejpeg ( $dstimg ) );
exit();
This is an example of get high resolution images.
/**
* Class name : resizeImage
* Created by : wang
* Description : This class is to resize the image from original size to new size
*/
class resizeImage
/**
* Function name : resize_img
* Description : This function is to resize image
* @param : $origimg variable is the original image
* @param : $newimg variable is the new image
* @param : $w variable is the width of image
* @param : $f variable is the height of image
*/
public function resize_img ( $origimg , $newimg , $w , $h ) $info = getimagesize ( $origimg );
$mime = $info [ ‘mime’ ];
// Make sure that the requested file is actually an image
if( substr ( $mime , 0 , 6 ) != ‘image/’ )
header ( ‘HTTP/1.1 400 Bad Request’ );
return ‘Error: requested file is not an accepted type: ‘ . $origimg ;
exit();
>
// Check they extention of image
$extension = image_type_to_extension ( $info [ 2 ]);
if( strtolower ( $extension ) == ‘.png’ ) $img = $this -> resize_imagepng ( $origimg , $w , $h );
imagepng ( $img , $newimg );
imagedestroy ( $img );
>elseif( strtolower ( $extension ) == ‘.jpeg’ ) $img = $this -> resize_imagejpeg ( $origimg , $w , $h );
imagejpeg ( $img , $newimg );
imagedestroy ( $img );
>elseif( strtolower ( $extension == ‘.gif’ )) $img = $this -> resize_imagegif ( $origimg , $w , $h );
imagegif ( $img , $newimg );
imagedestroy ( $img );
>
>
/**
* End function name : resize_img
*/
/**
* Function name : resize_imagepng
* Description : This function is to resize png image
* @param : $file variable is the original image
* @param : $w variable is the width of image
* @param : $f variable is the height of image
*/
private function resize_imagepng ( $file , $w , $h ) list( $width , $height ) = getimagesize ( $file );
$src = imagecreatefrompng ( $file );
$dst = imagecreatetruecolor ( $w , $h );
imagecopyresampled ( $dst , $src , 0 , 0 , 0 , 0 , $w , $h , $width , $height );
return $dst ;
>
/**
* End function name : resize_imagepng
*/
/**
* Function name : resize_imagejpeg
* Description : This function is to resize jpeg image
* @param : $file variable is the original image
* @param : $w variable is the width of image
* @param : $f variable is the height of image
*/
private function resize_imagejpeg ( $file , $w , $h ) list( $width , $height ) = getimagesize ( $file );
$src = imagecreatefromjpeg ( $file );
$dst = imagecreatetruecolor ( $w , $h );
imagecopyresampled ( $dst , $src , 0 , 0 , 0 , 0 , $w , $h , $width , $height );
return $dst ;
>
/**
* End function name : resize_imagejpeg
*/
/**
* Function name : resize_imagegif
* Description : This function is to resize gif image
* @param : $file variable is the original image
* @param : $w variable is the width of image
* @param : $f variable is the height of image
*/
private function resize_imagegif ( $file , $w , $h ) list( $width , $height ) = getimagesize ( $file );
$src = imagecreatefromgif ( $file );
$dst = imagecreatetruecolor ( $w , $h );
imagecopyresampled ( $dst , $src , 0 , 0 , 0 , 0 , $w , $h , $width , $height );
return $dst ;
>
/**
* End function name : resize_imagegif
*/
>
/**
* End class name : resizeImage
*/
?>