Solved

PHP -- HOw to Resize a JPG Image proportionately on upload function..

Posted on 2009-07-05
8
3,129 Views
Last Modified: 2012-06-27
Hello,
I have PHP script that resizes a JPG image (from an upload function)

However, the script that I have DOES NOT resize the image PROPORTIONANTLEY,  (sorry for spelling ;) )

The script i have attached resizes the image to a height of 100 pixels.  and it changes the width to 500.. (for some reason, but i do not see the variable in the PHP script,, i only see the HEIGHT of 100 variable)

What is needed to be changed to create a proportionate resize of 400 x 300.?

Anybody have an idea?

Cheers
<?php

// include the Database classes

require_once('classes/database_php4.php');
 

// escape quotes and apostrophes if magic_quotes_gpc off

if (!get_magic_quotes_gpc()) {

  foreach($_POST as $key=>$value) {

    $temp = addslashes($value);

    $_POST[$key] = $temp;

    }

  }
 

$db = new Database('db704.perfora.net','dbo277201649','Ycd2sZaR','db277201649');

$numrows = 1;

// if more than 3 send error message //

if ($numrows > 2) {

  $maxwishes = 'Personal Upload Limit Reached for Today... Sorry';

  echo 'duplicate=y&message='.urlencode($maxwishes);

  }

else {

		function createThumbs( $pathToImages, $pathToThumbs, $thumbWidth ) 

{

  // open the directory

  $dir = opendir( $pathToImages );
 

  // loop through it, looking for any/all JPG files:

  while (false !== ($fname = readdir( $dir ))) {

    // parse path for the extension

    $info = pathinfo($pathToImages . $fname);

    // continue only if this is a JPEG image

    if ( strtolower($info['extension']) == 'jpg' ) 

    {

      echo "Creating thumbnail for {$fname} <br />";
 

      // load image and get image size

      $img = imagecreatefromjpeg( "{$pathToImages}{$fname}" );

      $width = imagesx( $img );

      $height = imagesy( $img );
 

      // calculate thumbnail size

      $new_width = $thumbWidth;

      $new_height = floor( $height * ( $thumbWidth / $width ) );

      $new_height = 100;
 

      // create a new temporary image

      $tmp_img = imagecreatetruecolor( $new_width, $new_height );

      srand(time());

      $random = (rand()%999);

      $random2 = (rand()%999);
 

      // copy and resize old image into new image 

      imagecopyresized( $tmp_img, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height );

      $newname = 'cmsnewsv2'.$random.$random2.'.jpg';

      $_POST['new_name'] = $newname;
 

      // save thumbnail into a file

      imagejpeg( $tmp_img, "{$pathToThumbs}{$newname}" );

      unlink($tmp_img, "{$pathToimages}{$fname}");

      $tmp_img = "";

      $img = "";

      $info = "";

      $fname = "";

    }

  }

  // close the directory

  closedir( $dir );

}

createThumbs("files/","files/thumbs/",500);

  $sql = 'INSERT INTO cmsnewsv2 (story_title,story_body,story_date,story_postedby,story_photo,story_link,story_price)

          VALUES ("'.$_POST['ttitle'].'","'.$_POST['story'].'","'.$_POST['date'].'","'.$_POST['author'].'","'.$_POST['new_name'].'","'.$_POST['uurl'].'","'.$_POST['pprice'].'")';
 

	$result = $db->query($sql);

  if ($result) {

    $created = 'Thankyou!';

    echo 'duplicate=n&message='.urlencode($created);

}

}

?>

Open in new window

0
Comment
Question by:sam928
  • 3
  • 2
  • 2
8 Comments
 
LVL 108

Expert Comment

by:Ray Paseur
ID: 24780486
Here is an example of how to do it.  Please read it over and post back here if you have any questions.  Best regards, ~Ray
<?php // RAY_upload.php UPLOAD AN IMAGE AND RESIZE IT TO FIT A PREDEFINED SIZE
 
 

// A FUNCTION TO DETERMINE IF GD IS AT LEVEL 2 OR MORE

function get_gd_info($display=FALSE)

{
 

// IS GD INSTALLED AT ALL?

   if (!function_exists("gd_info"))

   {

      if ($display) echo "<br/>GD NOT INSTALLED\n";

      return FALSE;

   }
 

// IF GD IS INSTALLED GET DETAILS

   $gd = gd_info();
 

// IF DISPLAY IS REQUESTED, PRINT DETAILS

   if ($display)

   {

      echo "<br/>GD DETAILS:\n";

      foreach ($gd as $key => $value)

      {

         if ($value === TRUE)  $value = 'YES';

         if ($value === FALSE) $value = 'NO';

         echo "<br/>$key = $value \n";

      }

   }
 

// RETURN THE VERSION NUMBER

   $gd_version = ereg_replace('[^0-9\.]', '', $gd["GD Version"]);;

   return $gd_version;

}
 
 

// A FUNCTION TO MAKE AN IMAGE INTO THE RIGHT WIDTH FOR PAGE DISPLAY

// WILL WORK IF GD2 NOT INSTALLED, BUT WILL MAKE BETTER IMAGES WITH GD2

// INPUT IS THE IMAGE FILE NAME, OUTPUT IS AN IMAGE RESOURCE, OR FALSE IF NO RESIZE NEEDED

function create_right_size_image($image, $width=720)

{

// IS GD HERE?

   $gdv = get_gd_info();

   if (!$gdv) return FALSE;
 

// GET AN IMAGE THING

   $source = imagecreatefromjpeg("$image");
 

// GET THE X AND Y DIMENSIONS

   $imageX = imagesx($source);

   $imageY = imagesy($source);
 

// IF NO RESIZING IS NEEDED

   if ($imageX <= $width)

   {

      return FALSE;

   }
 

// THE WIDTH IS TOO GREAT - MUST RESIZE

   $tnailX = $width;

   $tnailY = (int) (($tnailX * $imageY) / $imageX );
 

// WHICH FUNCTIONS CAN RESIZE / RESAMPLE THE IMAGE?

   if ($gdv >= 2)

   {

// IF GD IS AT LEVEL 2 OR ABOVE

      $target = imagecreatetruecolor($tnailX, $tnailY);

      imagecopyresampled ($target, $source, 0, 0, 0, 0, $tnailX, $tnailY, $imageX, $imageY);

   } else

   {

// IF GD IS AT A LOWER REVISION LEVEL

      $target = imagecreate($tnailX, $tnailY);

      imagecopyresized   ($target, $source, 0, 0, 0, 0, $tnailX, $tnailY, $imageX, $imageY);

   }

   return $target ;

}

/* ********************************************************************************************* */
 
 

// ESTABLISH THE NAME OF THE PHOTOS DIRECTORY

$photos	= 'photos';
 

// ESTABLISH THE LARGEST FILE WE WILL UPLOAD

$max_file_size = '5000000'; // A BIT MORE THAN 4MB
 

// THIS IS A LIST OF THE POSSIBLE ERRORS THAT CAN BE REPORTED in $_FILES[]["error"]

$errors	= array(

	0=>"<font color=green>Success!</font>",

	1=>"<font color=gold>The uploaded file exceeds the upload_max_filesize directive in php.ini</font>",

	2=>"<font color=gold>The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form</font>",

	3=>"<font color=gold>The uploaded file was only partially uploaded</font>",

	4=>"<font color=gold>No file was uploaded</font>",

	6=>"<font color=gold>Missing a temporary folder</font>",

	7=>"<font color=gold>Cannot write file to disk</font>"

);
 

// IF THERE IS NOTHING USEFUL IN $_POST, PUT UP THE FORM FOR INPUT

if ( (empty($_POST['p'])) && (empty($_POST['MAX_FILE_SIZE'])) ) {

	?>

	<h2>Upload Photos</h2>
 

	<!-- ENCTYPE -->

	<form name="UploadForm" enctype="multipart/form-data" action="<?=$_SERVER["REQUEST_URI"]?>" method="POST">

	<input type="hidden" name="p" value="1" />

	<!-- MAX_FILE_SIZE must precede the file input field -->

	<input type="hidden" name="MAX_FILE_SIZE" value="<?=$max_file_size?>" />

	<!-- INPUT NAME= IN TYPE=FILE DETERMINES THE NAME FOR ACTION SCRIPT TO USE IN $_FILES ARRAY -->

	<p>

	Find the photo you want to upload and click the "Upload" button below.

	</p>
 

	<table cellpadding="1" cellspacing="1" border="0">

	<tr><td align="right"><span class="required">Photo: </span></td> <td><input name="userfile" type="file" size="80" /></td></tr>

	<tr><td> </td><td><input type="submit" name="_submit" value="Upload" />

	&nbsp; &nbsp; Check this box <input autocomplete="off" type="checkbox" name="overwrite" /> to <b>overwrite</b> an existing photo.</td></tr>

	</table>

	</form>

	<?php
 

	die();
 

} else {
 

// THERE IS POST DATA - PROCESS IT

	echo "<h2>Results: Upload Photos</h2>\n";

	echo "<p>\n";
 

// SYNTHESIZE THE NEW FILE NAME

	$f_type	= trim(strtolower(end    (explode( '.', basename($_FILES['userfile']['name'] )))));

	$f_name	= trim(strtolower(current(explode( '.', basename($_FILES['userfile']['name'] )))));

	$my_new = getcwd() . '/' . $photos . '/' . $f_name .'.'. $f_type;

	$my_file= $photos . '/' . $f_name .'.'. $f_type;
 

// TEST FOR ALLOWABLE EXTENSIONS

	if ($f_type != 'jpg')

	{

	   die('Sorry, only JPG files allowed');

	}
 

// IF THERE ARE ERRORS

	$error_code	= $_FILES["userfile"]["error"];

	if ($error_code != 0)

	{

		$error_message = $errors[$error_code];

		echo "<p class=\"required\">Upload Error Code: $error_code: $error_message</p>\n";

		die('Sorry');

	}
 

// MOVE THE FILE INTO THE DIRECTORY

	$overwrite	= $_POST['overwrite'];

	$file_size	= number_format($_FILES["userfile"]["size"]);
 

// IF THE FILE IS NEW

	if (!file_exists($my_new))

	{

		if (move_uploaded_file($_FILES['userfile']['tmp_name'], $my_new))

		{

			$upload_success = 1;

		} else

		{

			$upload_success = -1;

		}
 

// IF THE FILE ALREADY EXISTS

	} else

	{

		echo "<b><i>$my_file</i></b> already exists.\n";
 

// SHOULD WE OVERWRITE THE FILE? IF NOT

		if (empty($overwrite))

		{

			$upload_success = 0;
 

// IF WE SHOULD OVERWRITE THE FILE, TRY TO MAKE A BACKUP

		} else

		{

			$now	= date('Y-m-d');

			$my_bak = $my_new . '.' . $now . '.bak';

			if (!copy($my_new, $my_bak))

			{

				echo "<b>Attempted Backup Failed!</b>\n";

			}

			if (move_uploaded_file($_FILES['userfile']['tmp_name'], $my_new))

			{

				$upload_success = 2;

			} else

			{

				$upload_success = -1;

			}

		}

	}
 

// REPORT OUR SUCCESS OR FAILURE

	if ($upload_success == 2) { echo "It has been overwritten.\n"; }

	if ($upload_success == 1) { echo "<b><i>$my_file</i></b> has been saved.\n"; }

	if ($upload_success == 0) { echo "<b>It was NOT overwritten.</b>\n"; }
 

	if ($upload_success > 0)

	{

		echo "$file_size bytes uploaded.\n";

		chmod ($my_new, 0755);

	}
 

	echo "</p>\n";
 

// RESIZE THE FILE TO FIT PAGE WIDTH, IF NECESSARY

	if ($upload_success > 0)

	{

		if ($imageblob	= create_right_size_image($my_new))

		{

			imagejpeg($imageblob, $my_new);

		}

	}
 

	echo "<p><a href=\"$my_file\">See the file</a></p>\n";
 
 

	die('Done');

}

?>

Open in new window

0
 
LVL 2

Accepted Solution

by:
Erbureth earned 500 total points
ID: 24780492
Commenting out line 43 should do the trick ($new_height = 100;)

on line 42 you already have correct formula to calculate new height, but you overwrite it afterwards, which is bad.
0
 
LVL 108

Expert Comment

by:Ray Paseur
ID: 24780576
@Erbureth: Good catch.  After I saw the references to PHP4, I never bothered to read or test the script!

Best to all, ~Ray
0
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 

Author Comment

by:sam928
ID: 24780646
Hello, Thank you for the lightning fast responses!!

@Erbureth, i have commented that line out,, and i have checked the result;  

I uploaded a 80 x 60 image... and it converted it to 500 x 375.

---------------------------
soo, somewhere it is resizing the width to 500.  i do not know where,  (is that what  'thumbWidth' is referring to? )   --- line 41 and 42.

i'm confused!


0
 

Author Comment

by:sam928
ID: 24780677
... Line 21 also... refers to 'thumbWidth'


0
 
LVL 108

Expert Comment

by:Ray Paseur
ID: 24780766
Read over the code I posted in lines 36 to 76.  It tests for appropriate sizes and does not resize images that are already small enough.  Hopefully the comments in that section will be helpful.  Best, ~Ray
0
 
LVL 2

Expert Comment

by:Erbureth
ID: 24781541
This is because at line 68, you are calling function createThumbs with last parameter 500
If you see the function prototype at line 21, you will see that the last parameter is that thumbWidth, which is desired width of all thumbnails.
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

PaperPort 14.5 Patch 1 update is often not detected or downloaded automatically. This article provides direct download links to solve the problem for retail (non-bundled) versions of the Standard and Professional editions, as well as the Professiona…
These days socially coordinated efforts have turned into a critical requirement for enterprises.
The goal of the tutorial is to teach the user what gradient filters are and how to use them. When you have a photo and some part of the photo is either over exposed or under exposed, you use a gradient filter to help mask the need to touch up th…
The goal of the tutorial is to teach the user how to use import presets downloaded from the internet into Adobe Lightroom. Once you downloaded the presets go into the preset folder and press import then import your preset and your set it to go.

910 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

19 Experts available now in Live!

Get 1:1 Help Now