halocursed
halocursed

Reputation: 2485

compress image file size on upload?

I am uploading product screenshots to my website... I want to upload the original image as it is and also create a thumbnail for it, but after uploading both the files the filesize of the thumbnail created is a bit larger than expected. Is there any way I could reduce the filesize of the thumbnail without compromising much on the quality in php or by using Imagemagick( which I have no idea how to use but I'm willing to learn if needed)...
Below is the code I'm using to upload my files..

<form action="<?php echo $_server['php-self'];  ?>" method="post" enctype="multipart/form-data" id="something" class="uniForm">
    <input name="new_image" id="new_image" size="30" type="file" class="fileUpload" />
    <button name="submit" type="submit" class="submitButton">Upload/Resize Image</button>


<?php
    if(isset($_POST['submit'])){
      if (isset ($_FILES['new_image'])){
          $imagename = $_FILES['new_image']['name'];
          $source = $_FILES['new_image']['tmp_name'];
          $target = "images/".$imagename;
          move_uploaded_file($source, $target);

          $imagepath = $imagename;
          $save = "images/" . $imagepath; //This is the new file you saving
          $file = "images/" . $imagepath; //This is the original file

          list($width, $height) = getimagesize($file) ; 


          $tn = imagecreatetruecolor($width, $height) ; 
          $image = imagecreatefromjpeg($file) ; 
          imagecopyresampled($tn, $image, 0, 0, 0, 0, $width, $height, $width, $height) ; 

          imagejpeg($tn, $save, 100) ; 

          $save = "images/sml_" . $imagepath; //This is the new file you saving
          $file = "images/" . $imagepath; //This is the original file

          list($width, $height) = getimagesize($file) ; 

          $modwidth = 130; 

          $diff = $width / $modwidth;

          $modheight = 185; 
          $tn = imagecreatetruecolor($modwidth, $modheight) ; 
          $image = imagecreatefromjpeg($file) ; 
          imagecopyresampled($tn, $image, 0, 0, 0, 0, $modwidth, $modheight, $width, $height) ; 

          imagejpeg($tn, $save, 100) ; 
        echo "Large image: <img src='images/".$imagepath."'><br>"; 
        echo "Thumbnail: <img src='images/sml_".$imagepath."'>"; 

      }
    } ?>

Kindly point me in the right direction...Thanks

Upvotes: 14

Views: 65603

Answers (7)

Roshan Kr Soni
Roshan Kr Soni

Reputation: 1

it moving compressed image with original. actually i want to move only compressed image that starts with "rxn-".

                include("do.php");
                session_start();
                if(is_array($_FILES)) {

                for($i=0; $i<count($_FILES['userImage']['tmp_name']); $i++){


                        if(is_uploaded_file($_FILES['userImage']['tmp_name'][$i])) {
                        $sourcePath = $_FILES['userImage']['tmp_name'][$i];
                        $upload_dir = "images/";
                        $targetPath = "images/".basename($_FILES['userImage']['name'][$i]);
                        $source_image = "images/".basename($_FILES['userImage']['name'][$i]);
                        $imageName =$_FILES['userImage']['name'][$i];


                        $imageFileType = strtolower(pathinfo($targetPath,PATHINFO_EXTENSION)); 

                        $check = getimagesize($_FILES["userImage"]["tmp_name"][$i]);



                        if (file_exists($targetPath)) {
                           // echo "<span style='color:red;'> file already exists</span> ";

                        }

                              if($check !== false) {
                               // echo "File is an image - " . $check["mime"] . ".";
                                $uploadOk = 1;
                            } else {
                                echo "<span style='color:red;'>File is not an image.</span><br>";
                                $uploadOk = 0;
                            }


                        if($imageFileType == "jpg" || $imageFileType == "png" || $imageFileType == "jpeg"
                        ||  $imageFileType =="gif" ) {



                        if(move_uploaded_file($sourcePath,$targetPath)) 
                        //if(1) 
                        {

                            $image_destination = $upload_dir."rxn-".$imageName;
                            $compress_images = compressImage($source_image, $image_destination);

                            $pId=$_SESSION['pId'];

                            $sql="insert into image(p_id,img_path) values('$pId','$compress_images')";
                            $result = mysql_query($sql);
                            echo "
                            <div class='col-sm-3' id='randomdiv' style='padding-bottom: 15px;'>  
                            <div class='bg_prcs uk-height-small uk-flex uk-flex-center uk-flex-middle   uk-background-cover uk-light   uk-card-default uk-card-hover imgt'   data-src='$image_destination' uk-img>
                             </div>
                            </div>


                            ";  


                        }

                        }
                        else{ echo "<span style='color:red;'> only JPG, JPEG, PNG & GIF files are allowed.</span>";
                             }






                        }

                }

                }

                // created compressed JPEG file from source file
                function compressImage($source_image, $compress_image) {
                $image_info = getimagesize($source_image);
                if ($image_info['mime'] == 'image/jpeg') {
                $source_image = imagecreatefromjpeg($source_image);
                imagejpeg($source_image, $compress_image, 75);
                } elseif ($image_info['mime'] == 'image/gif') {
                $source_image = imagecreatefromgif($source_image);
                imagegif($source_image, $compress_image, 75);
                } elseif ($image_info['mime'] == 'image/png') {
                $source_image = imagecreatefrompng($source_image);
                imagepng($source_image, $compress_image, 6);
                }
                return $compress_image;
                }


                ?>

Upvotes: 0

Kamlesh Kumar
Kamlesh Kumar

Reputation: 1680

Hello @halocursed I just try to compress using your code for different image type like png and gif than image comes black. So, I modify the block of code and good working for jpg, png.

<?php
    if(isset($_POST['submit'])){
      if (isset ($_FILES['new_image'])){
          // print_r($_FILES); die;
          $imagename = $_FILES['new_image']['name'];
          $source = $_FILES['new_image']['tmp_name'];
          $target = "images/".$imagename;
          move_uploaded_file($source, $target);

          $imagepath = $imagename;
          $save = "images/" . $imagepath; //This is the new file you saving
          $file = "images/" . $imagepath; //This is the original file

          list($width, $height) = getimagesize($file); 

          $tn = imagecreatetruecolor($width, $height);

          //$image = imagecreatefromjpeg($file);
          $info = getimagesize($target);
          if ($info['mime'] == 'image/jpeg'){
            $image = imagecreatefromjpeg($file);
          }elseif ($info['mime'] == 'image/gif'){
            $image = imagecreatefromgif($file);
          }elseif ($info['mime'] == 'image/png'){
            $image = imagecreatefrompng($file);
          }

          imagecopyresampled($tn, $image, 0, 0, 0, 0, $width, $height, $width, $height);
          imagejpeg($tn, $save, 60);

          echo "Large image: ".$imagepath;

      }
    } 
?>

Upvotes: 6

Marijan
Marijan

Reputation: 21

It should be 60, it stands for 60 percent.

Example: If you open an image in Photoshop and try save it for web and select jpg, you can see that by using 60 it's still under high quality, but lower file size. If you would like lower, with more degradation, meaning the colors are distorted more.

More than 60 does not give you anything better, only larger file size.

It's standard image optimization for web. Keep high quality but keep file size as low as possible.

Upvotes: 2

Pascal MARTIN
Pascal MARTIN

Reputation: 401002

If using jpeg, using a quality between 75 and 85 is generally more than acceptable (and 100 takes way too much space, for a gain that is not that important, btw), at least for photos.

As a sidenote, if you are dealing with screenshots, using PNG might get you a better quality : jpeg degrades the images (it is quite OK for photos, but for screenshots, with fonts that are drawn by pixels, it can bring some not nice-looking effect)

Upvotes: 1

Alix Axel
Alix Axel

Reputation: 154543

75 is the default quality setting, however you'll notice quality decrease considerably if you use it. 90 gives you a great image quality and reduces the file size in half, if you want to decrease the file size even more use 85 or 80 but nothing bellow that.

Upvotes: 2

Paul Dixon
Paul Dixon

Reputation: 300845

Don't pass 100 as the quality for imagejpeg() - anything over 90 is generally overkill and just gets you a bigger JPEG. For a thumbnail, try 75 and work downwards until the quality/size tradeoff is acceptable.

//try this
imagejpeg($tn, $save, 75) ; 

Upvotes: 17

Rufinus
Rufinus

Reputation: 30741

A quality setting of 100% ist quite to large. try 85 or 90% you wont see a difference on most of the images.

see: http://www.ampsoft.net/webdesign-l/jpeg-compression.html

Upvotes: 1

Related Questions