?
Solved

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

Posted on 2009-07-05
8
Medium Priority
?
4,764 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
  • 2
  • 2
8 Comments
 
LVL 111

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

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
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 

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 111

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

Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

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

Build an array called $myWeek which will hold the array elements Today, Yesterday and then builds up the rest of the week by the name of the day going back 1 week.   (CODE) (CODE) Then you just need to pass your date to the function. If i…
Password hashing is better than message digests or encryption, and you should be using it instead of message digests or encryption.  Find out why and how in this article, which supplements the original article on PHP Client Registration, Login, Logo…
The goal of the tutorial is to teach the user what exposure is and how to use the exposure slider. Analyze the photo that you want to edit, then adjust the exposure slider to your liking.
This video Micro Tutorial shows how to password-protect PDF files with free software. Many software products can do this, such as Adobe Acrobat (but not Adobe Reader), Nuance PaperPort, and Nuance Power PDF, but they are not free products. This vide…

718 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