Search code examples
phpmysqlfile-uploadimage-resizing

PHP Image Resizing


I've got a script that uploads files to the server as well as adds the filename to a database, but what I'd like to do it restrict the maximum dimensions of the image before uploading. So if I upload an image that is 1000 x 500 it will be restricted but still keep it's dimensions and will be changed to 200 x 100, but an image that is 300 x 300 will be restricted to 200 x 200

    <?php 

     //This is the directory where images will be saved 
     $target = "uploads/"; 
     $target = $target . basename( $_FILES['photo']['name']); 

     //This gets all the other information from the form 
     $name=$_POST['name']; 
     $pic=($_FILES['photo']['name']); 

     // Connects to your Database 
     mysql_connect("hostname", "username", "password") or die(mysql_error()) ; 
     mysql_select_db("database") or die(mysql_error()) ; 

     //Writes the information to the database 
     mysql_query("INSERT INTO `table` (name, photo) VALUES ('$name','$pic')") ; 

     //Writes the photo to the server 
     if(move_uploaded_file($_FILES['photo']['tmp_name'], $target)) 
     { 

     //Tells you if its all ok 
     echo "The file ". basename( $_FILES['uploadedfile']['name']). " has been uploaded"; 
     } 
     else { 

     //Gives and error if its not 
     echo "Sorry, there was a problem uploading your file."; 
     } 
     ?> 

Thanks for your help


Solution

  • To my knowledge, you can’t resize the image before uploading it. (I could be wrong!) However, when you upload the image it goes into a temporary file. You can resize the temporary image and copy the resized image to its final destination.

    Since (it seems) you want to keep the width constant, you don’t really need to do a lot of ratio tests.

    Update:

    You should be able to simply use this in place of your original code. Most of it is unchanged.

    <?php
    
    // resizes an image to fit a given width in pixels.
    // works with BMP, PNG, JPEG, and GIF
    // $file is overwritten
    function fit_image_file_to_width($file, $w, $mime = 'image/jpeg') {
        list($width, $height) = getimagesize($file);
        $newwidth = $w;
        $newheight = $w * $height / $width;
        
        switch ($mime) {
            case 'image/jpeg':
                $src = imagecreatefromjpeg($file);
                break;
            case 'image/png';
                $src = imagecreatefrompng($file);
                break;
            case 'image/bmp';
                $src = imagecreatefromwbmp($file);
                break;
            case 'image/gif';
                $src = imagecreatefromgif($file);
                break;
        }
        
        $dst = imagecreatetruecolor($newwidth, $newheight);
        imagecopyresampled($dst, $src, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
        
        switch ($mime) {
            case 'image/jpeg':
                imagejpeg($dst, $file);
                break;
            case 'image/png';
                imagealphablending($dst, false);
                imagesavealpha($dst, true);
                imagepng($dst, $file);
                break;
            case 'image/bmp';
                imagewbmp($dst, $file);
                break;
            case 'image/gif';
                imagegif($dst, $file);
                break;
        }
        
        imagedestroy($dst);
    }
    
    // init file vars
    $pic  = $_FILES['photo']['name'];
    $target = 'uploads/' . basename( $_FILES['photo']['name']);
    $temp_name = $_FILES['photo']['tmp_name'];
    $type = $_FILES["photo"]["type"];
    
    // Connects to your Database 
    mysql_connect("hostname", "username", "password") or die(mysql_error()) ; 
    mysql_select_db("database") or die(mysql_error()) ; 
    
    // get form data
    $name = mysql_real_escape_string(isset($_POST['name']) ? $_POST['name'] : 'No name');
    
    //Writes the information to the database 
    mysql_query("INSERT INTO `table` (name, photo) VALUES ('$name','$pic')") ; 
    
    // resize the image in the tmp directorys
    fit_image_file_to_width($temp_name, 200, $type);
    
    //Writes the photo to the server
    if(move_uploaded_file($temp_name, $target)) {
    
        //Tells you if its all ok 
        echo "The file ". basename( $_FILES['photo']['name'] ). " has been uploaded"; 
    
    } else {
    
        //Gives and error if its not 
        echo "Sorry, there was a problem uploading your file."; 
    
    }
    
    ?>