3

Possible Duplicate:
Resize a picture to a fixed size

I am using the following php code to resize (the width) and save an image, the code is working no error but the image is not getting resized.

<?php
$old_path = "users_images/".$name.".".$type;
    $new_path = "main_images/".$name.".".$type;
    $image_size = getimagesize($new_path);
    if($image_size['0'] > 700){
        $image_size['0'] = 700;
        }
        rename($old_path, $new_path);// save image

?>

basically if the image width is grater than 700 I want to set it to 700 ? what I am doing wrong ?

Community
  • 1
  • 1
user1481850
  • 238
  • 3
  • 13
  • 24
  • 2
    Your code does not do any resizing.. all you do is overwrite the calculated value that getimagesize returns – Ben Jun 26 '12 at 22:13
  • 1
    You just changed the width value in memory, never actually did anything to the image (apart from renaming it). – sachleen Jun 26 '12 at 22:13
  • 1
    Though a basic error, this does not deserve a downvote – Ben Jun 26 '12 at 22:14

3 Answers3

15

The variable $image_size['0'] is not a reference to the actual image size.

You'll need to calculate the ratio of the dimensions, then resize it with an appropriate function that resizes images, probably in the GD library.

First, you'll have to load the image. I'll let you choose what the type is:

$image = imagecreatefromjpeg($new_path);
$image = imagecreatefromgif($new_path);
$image = imagecreatefrompng($new_path);

Now calculate the ratio:

$ratio = 700 / imagesx($image); // 700 for the width you want...
                                // imagesx() to determine the current width

Get the scaled height:

$height = imagesy($image) * $ratio; // imagesy() to determine the current height

Do the actual resize:

$new_image = imagecreatetruecolor($width, $height);
imagecopyresampled($new_image, $image, 0, 0, 0, 0, $width, $height, imagesx($image), imagesy($image));
$image = $new_image; // $image has now been replaced with the resized one.

I found a simple class for resizing images. To protect from link rotting, I have recreated it here:

<?php

/*
* File: SimpleImage.php
* Author: Simon Jarvis
* Copyright: 2006 Simon Jarvis
* Date: 08/11/06
* Link: http://www.white-hat-web-design.co.uk/articles/php-image-resizing.php
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details:
* http://www.gnu.org/licenses/gpl.html
*
*/

class SimpleImage {

   var $image;
   var $image_type;

   function load($filename) {

      $image_info = getimagesize($filename);
      $this->image_type = $image_info[2];
      if( $this->image_type == IMAGETYPE_JPEG ) {

         $this->image = imagecreatefromjpeg($filename);
      } elseif( $this->image_type == IMAGETYPE_GIF ) {

         $this->image = imagecreatefromgif($filename);
      } elseif( $this->image_type == IMAGETYPE_PNG ) {

         $this->image = imagecreatefrompng($filename);
      }
   }
   function save($filename, $image_type=IMAGETYPE_JPEG, $compression=75, $permissions=null) {

      if( $image_type == IMAGETYPE_JPEG ) {
         imagejpeg($this->image,$filename,$compression);
      } elseif( $image_type == IMAGETYPE_GIF ) {

         imagegif($this->image,$filename);
      } elseif( $image_type == IMAGETYPE_PNG ) {

         imagepng($this->image,$filename);
      }
      if( $permissions != null) {

         chmod($filename,$permissions);
      }
   }
   function output($image_type=IMAGETYPE_JPEG) {

      if( $image_type == IMAGETYPE_JPEG ) {
         imagejpeg($this->image);
      } elseif( $image_type == IMAGETYPE_GIF ) {

         imagegif($this->image);
      } elseif( $image_type == IMAGETYPE_PNG ) {

         imagepng($this->image);
      }
   }
   function getWidth() {

      return imagesx($this->image);
   }
   function getHeight() {

      return imagesy($this->image);
   }
   function resizeToHeight($height) {

      $ratio = $height / $this->getHeight();
      $width = $this->getWidth() * $ratio;
      $this->resize($width,$height);
   }

   function resizeToWidth($width) {
      $ratio = $width / $this->getWidth();
      $height = $this->getheight() * $ratio;
      $this->resize($width,$height);
   }

   function scale($scale) {
      $width = $this->getWidth() * $scale/100;
      $height = $this->getheight() * $scale/100;
      $this->resize($width,$height);
   }

   function resize($width,$height) {
      $new_image = imagecreatetruecolor($width, $height);
      imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight());
      $this->image = $new_image;
   }      

}
?>
Deltik
  • 1,129
  • 7
  • 32
3

You are setting a variable, not resizing image. I dug up some old function, you need to pass image object, save path, image name, max height, max width and quality. It's not the best function, but it get's the job done.

function resizeImage($imgObject, $savePath, $imgName, $imgMaxWidth, $imgMaxHeight, $imgQuality)
{
    $source = imagecreatefromjpeg($imgObject['tmp_name']);
    list($imgWidth, $imgHeight) = getimagesize($imgObject['tmp_name']);
    $imgAspectRatio = $imgWidth / $imgHeight;
    if ($imgMaxWidth / $imgMaxHeight > $imgAspectRatio)
    {
        $imgMaxWidth = $imgMaxHeight * $imgAspectRatio;
    }
    else
    {
        $imgMaxHeight = $imgMaxWidth / $imgAspectRatio;
    }
    $image_p = imagecreatetruecolor($imgMaxWidth, $imgMaxHeight);
    $image = imagecreatefromjpeg($imgObject['tmp_name']);
    imagecopyresampled($image_p, $source, 0, 0, 0, 0, $imgMaxWidth, $imgMaxHeight, $imgWidth, $imgHeight);
    imagejpeg($image_p, $savePath . $imgName, $imgQuality);
    unset($imgObject);
    unset($source);
    unset($image_p);
    unset($image);
}
Stan
  • 25,744
  • 53
  • 164
  • 242
  • What is the point of creating `$image` since it is not used in the rest of the code? You only use `$image_p` and `$source` after that. – Michael Yaworski Jan 24 '16 at 00:27
  • 1
    There is no point, you should also not unset anything IMO. This was way back so I don't remember why I did this :) – Stan Jan 27 '16 at 18:53
  • If you already upload the file to server, you should change all $imgObject['tmp_name'] codes to $imgObject. Thats work for me thanks a lot, u save my night ;) – matasoy Sep 10 '16 at 21:56
0

You should copy / move the image with the imagecopyresampled function, which is part of the GD extension.

Dutow
  • 5,638
  • 1
  • 30
  • 40