Image Resize, Crop, Thumbnail, Watermark PHP Script

by MIND

Aug
03

We’re going to write a function called image_handler in PHP. We’ll provide parameters to specify the image width, height, whether or not to watermark the image, and the source of the watermark, when the function is called. We’ll supply a few default values for these parameters as well.

<?php
function image_handler($source_image,$destination,$tn_w = 100,$tn_h = 100,$quality = 80,$wmsource = false) {

  #find out what type of image this is
  $info = getimagesize($source_image);
  $imgtype = image_type_to_mime_type($info[2]);

  #assuming the mime type is correct
  switch ($imgtype) {
	  case 'image/jpeg':
		$source = imagecreatefromjpeg($source_image);
	  break;
	  case 'image/gif':
		$source = imagecreatefromgif($source_image);
	  break;
	  case 'image/png':
		$source = imagecreatefrompng($source_image);
	  break;
	  default:
		die('Invalid image type.');
  }

  #Figure out the dimensions of the image and the dimensions of the desired thumbnail
  $src_w = imagesx($source);
  $src_h = imagesy($source);
  $src_ratio = $src_w/$src_h;
  #Do some math to figure out which way we'll need to crop the image
  #to get it proportional to the new size, then crop or adjust as needed
  if ($tn_w/$tn_h > $src_ratio) {
    $new_h = $tn_w/$src_ratio;
    $new_w = $tn_w;
  } else {
    $new_w = $tn_h*$src_ratio;
    $new_h = $tn_h;
  }
  $x_mid = $new_w/2;
  $y_mid = $new_h/2;
  $newpic = imagecreatetruecolor(round($new_w), round($new_h));
  imagecopyresampled($newpic, $source, 0, 0, 0, 0, $new_w, $new_h, $src_w, $src_h);
  $final = imagecreatetruecolor($tn_w, $tn_h);
  imagecopyresampled($final, $newpic, 0, 0, ($x_mid-($tn_w/2)), ($y_mid-($tn_h/2)), $tn_w, $tn_h, $tn_w, $tn_h);

  #if we need to add a watermark
  if($wmsource) {
    #find out what type of image the watermark is
    $info = getimagesize($wmsource);
    $imgtype = image_type_to_mime_type($info[2]);

    #assuming the mime type is correct
    switch ($imgtype) {
  	  case 'image/jpeg':
  		$watermark = imagecreatefromjpeg($wmsource);
  	  break;
  	  case 'image/gif':
  		$watermark = imagecreatefromgif($wmsource);
  	  break;
  	  case 'image/png':
  		$watermark = imagecreatefrompng($wmsource);
  	  break;
  	  default:
  		die('Invalid watermark type.');
    }

    #if we're adding a watermark, figure out the size of the watermark
    #and then place the watermark image on the bottom right of the image
    $wm_w = imagesx($watermark);
    $wm_h = imagesy($watermark);
    imagecopy($final, $watermark, $tn_w - $wm_w, $tn_h - $wm_h, 0, 0, $tn_w, $tn_h);
  }
  if(Imagejpeg($final,$destination,$quality)) {
    return true;
  }
  return false;
}
?>

Now we’ll write a small form for uploading the images we want to handle with this function.

<form method="post" enctype="multipart/form-data">
Source Image: <input type="file" name="uploaded_image" />
<input type="submit" value="Handle This Image" />
</form>

And finally, the uploaded image processing, setting parameters, and a small success/failure message. Make sure the destination path is writable!

if($_FILES) {
$source_image = $_FILES['uploaded_image']['tmp_name'];
$destination = '/path/to/the/final/image/filename.jpg';
$tn_w = 400;
$tn_h = 400;
$quality = 100;
$wmsource = '/path/to/your/watermark/image.png';
$success = image_handler($source_image,$destination,$tn_w,$tn_h,$quality,$wmsource);
if($success) { echo "Your image was saved successfully!"; }
else { echo "Your image was not saved."; }
}

Related Posts:

MIND Development & Design Lancaster PA Web Design and Lancaster PA Web Development is a Web Design and Web Development Solution based in Lancaster PA. MIND Lancaster PA Graphic Design provides logo and branding services as well as Lancaster PA Internet Marketing and Lancaster PA Social Media services.

{ 6 comments… read them below or add one }

Network Switch January 28, 2011 at 9:26 am

I am really thankful to this topic because it really gives great information.

Reply

whocares April 7, 2011 at 3:29 pm

how can i change the watermark padding? would like to put in x=3 and y=34 from the top left corner.. :)

Reply

MIND April 7, 2011 at 4:34 pm

In the image_handler function, change this part (under the comment starting “if we’re adding a watermark”):

    imagecopy($final, $watermark, $tn_w - $wm_w, $tn_h - $wm_h, 0, 0, $tn_w, $tn_h);

To this:

   $x_pos = 3;
   $y_pos = 34;
   imagecopy($final, $watermark, $x_pos, $y_pos, 0, 0, $tn_w, $tn_h);

Check out php.net’s entry on imagecopy if you’d like to understand more.

Reply

whocares April 10, 2011 at 3:25 pm

thanks, working fine :)

Reply

Rafael Caro November 21, 2011 at 3:46 pm

I’m getting the “Invalid image type.” error, any help?

Reply

MIND November 21, 2011 at 4:58 pm

The script only works for gifs, pngs, and jpegs, that error happens when you’re using a different type of image, or if the mime type is reported incorrectly.

Also, it should go without saying but make sure you have GD installed!

Reply

Leave a Comment

Previous post:

Next post: