Maxi
Maxi

Reputation: 123

Compress and RESCALE uploaded image

I have a function that uploads files up to 8MB but now I also want to compress or at least rescale larger images, so my output image won't be any bigger than 100-200 KB and 1000x1000px resolution. How can I implement compress and rescale (proportional) in my function?

function uploadFile($file, $file_restrictions = '', $user_id, $sub_folder = '') {
    global $path_app;
    $new_file_name    = generateRandomString(20);

    if($sub_folder != '') {
        if(!file_exists('media/'.$user_id.'/'.$sub_folder.'/')) {
            mkdir('media/'.$user_id.'/'.$sub_folder, 0777);
        }
        $sub_folder = $sub_folder.'/';
    }
    else {
        $sub_folder = '';
    }

    $uploadDir  = 'media/'.$user_id.'/'.$sub_folder;
    $uploadDirO = 'media/'.$user_id.'/'.$sub_folder;
    $finalDir   = $path_app.'/media/'.$user_id.'/'.$sub_folder;

    $fileExt    = explode(".", basename($file['name']));
    $uploadExt  = $fileExt[count($fileExt) - 1];
    $uploadName = $new_file_name.'_cache.'.$uploadExt;
    $uploadDir  = $uploadDir.$uploadName;

    $restriction_ok = true;
    if(!empty($file_restrictions)) {
        if(strpos($file_restrictions, $uploadExt) === false) {
            $restriction_ok = false;
        }
    }
    if($restriction_ok == false) {
        return '';
    }
    else {
        if(move_uploaded_file($file['tmp_name'], $uploadDir)) {
            $image_info     = getimagesize($uploadDir);
            $image_width    = $image_info[0];
            $image_height   = $image_info[1];

            if($file['size'] > 8000000) {
                unlink($uploadDir);
                return '';
            }
            else {
                $finalUploadName    = $new_file_name.'.'.$uploadExt;
                rename($uploadDirO.$uploadName, $uploadDirO.$finalUploadName);

                return $finalDir.$finalUploadName;
            }
        }
        else {
            return '';
        }
    }
}

Upvotes: 1

Views: 63

Answers (3)

Manoj Dhiman
Manoj Dhiman

Reputation: 5166

you can use a simple one line solution through imagemagic library the command will like this

$image="path to image";
$res="option to resize"; i.e 25% small , 50% small or anything else
exec("convert ".$image." -resize ".$res." ".$image);

with this you can rotate resize and many other image customization

Upvotes: 1

KIKO Software
KIKO Software

Reputation: 16804

For the rescaling I use a function like this:

function dimensions($width,$height,$maxWidth,$maxHeight)
// given maximum dimensions this tries to fill that as best as possible
{
  // get new sizes
  if ($width > $maxWidth) { 
    $height = Round($maxWidth*$height/$width);  
    $width  = $maxWidth;  
  }
  if ($height > $maxHeight) { 
    $width  = Round($maxHeight*$width/$height); 
    $height = $maxHeight; 
  }
  // return array with new size
  return array('width' => $width,'height' => $height);
}

The compression is done by a PHP function:

  // set limits
  $maxWidth  = 1000;
  $maxHeight = 1000;
  // read source
  $source = imagecreatefromjpeg($originalImageFile);
  // get the possible dimensions of destination and extract
  $dims = dimensions(imagesx($source),imagesy($source),$maxWidth,$maxHeight);
  // prepare destination
  $dest = imagecreatetruecolor($dims['width'],$dims['height']);
  // copy in high-quality
  imagecopyresampled($dest,$source,0,0,0,0,
                     $width,$height,imagesx($source),imagesy($source));
  // save file
  imagejpeg($dest,$destinationImageFile,85);
  // clear both copies from memory
  imagedestroy($source);
  imagedestroy($dest);

You will have to supply $originalImageFile and $destinationImageFile. This stuff comes from a class I use, so I edited it quite a lot, but the basic functionality is there. I left out any error checking, so you still need to add that. Note that the 85 in imagejpeg() denotes the amount of compression.

Upvotes: 1

jogesh_pi
jogesh_pi

Reputation: 9782

Take a look on imagecopyresampled(), There is also a example that how to implement it, For compression take a look on imagejpeg() the third parameter helps to set quality of the image, 100 means (best quality, biggest file) and if you skip the last option then default quality is 75 which is good and compress it.

Upvotes: 0

Related Questions