Denis Bobrovnikov
Denis Bobrovnikov

Reputation: 33

PHP GD Image Cropping Function

I use this piece of code to make thumbnails of an uploaded image.

   $file = randString().'.jpg';
   $uniPath = 'i/u'.$login;
   $completePath = $uniPath.'/a/'.$file;
   $thumbPath = $uniPath.'/b/'.$file;
   if(copy($_FILES['filename']['tmp_name'], $completePath)){

function convertPic($w_dst, $h_dst, $n_img){
   $wxh = $w_dst.'x'.$h_dst;
   switch($wxh){
    case '150x150': $letter = 'b'; break;
    case '50x50': $letter = 'c'; break;
    default: $letter = 'z';
   }
   $dbPath = '/i/u1/'.$letter.'/'.$n_img;
   $new_img = $_SERVER['DOCUMENT_ROOT'].$dbPath; 
   $file_src = "img.jpg";  //  temporary safe image storage
   $img_src = $file_src;
   unlink($file_src);
   move_uploaded_file($_FILES['filename']['tmp_name'], $file_src);

   list($w_src, $h_src, $type) = getimagesize($file_src);     // create new dimensions, keeping aspect ratio

   $ratio = $w_src/$h_src;

    $h_ratio = ($h_dst / $h_src);
    $w_ratio = ($w_dst / $w_src);

    if($w_src > $h_src){  //landscape
     $w_crop = round($w_src * $h_ratio);
     $h_crop = $h_dst;
     $src_x = ceil(($w_src - $h_src)/2);
     $src_y = 0;
    }
    elseif($w_src < $h_src){ // portrait
     $h_crop = round($h_src * $w_ratio);
     $w_crop = $w_dst;
     $src_y = ceil(($h_src - $w_src)/2);
     $src_x = 0;
    }
    else {  //square
     $w_crop = $w_dst;
     $h_crop = $h_dst;
     $src_x = 0;
     $src_y = 0;
    }

   switch ($type)
     {case 1:   //   gif -> jpg
        $img_src = imagecreatefromgif($file_src);
        break;
      case 2:   //   jpeg -> jpg
        $img_src = imagecreatefromjpeg($file_src);
        break;
      case 3:  //   png -> jpg
        $img_src = imagecreatefrompng($file_src);
        break;
     }
   $img_dst = imagecreatetruecolor($w_dst, $h_dst);  //  resample
   imagecolorallocate($img_dst, 255, 255, 255) or die("fail imagecolorallocate");

   imagecopyresampled($img_dst, $img_src, 0, 0, $src_x, $src_y, $w_crop, $h_crop, $w_src, $h_src) or die("imagecopyresampled($img_dst, $img_src, 0, 0, $src_x, $src_y, $w_crop, $h_crop, $w_src, $h_src)");
   imagejpeg($img_dst, $new_img);    //  save new image

   unlink($file_src);  //  clean up image storage
   imagedestroy($img_src);       
   imagedestroy($img_dst);
   return $db_path;
  }

convertPic(150, 150, $file);
convertPic(250, 250, $file);

But for some reason the convertPic function does not work if called twice as in the example above. If it is called once everything works fine. I've put an alert if imagecopyresampled fails and it outputs

imagecopyresampled(Resource id #17, img.jpg, 0, 0, 0, 0, 250, 250, , )

I think the problem is with the temporary image storing but not sure. Please help.

Upvotes: 0

Views: 727

Answers (2)

Wh1T3h4Ck5
Wh1T3h4Ck5

Reputation: 8509

I guess problem is with unlink($file_src)...

First, you call convertPic() function and it works OK because your img.jpg is still here, then you remove your image with unlink() and try to call again same routine that actually needs this file to work properly.

Also you can't move same file twice, so you have to move it outside the function, do your job as many times as needed, and after that, unlink image. Unlink should be after double-call of convertPic(), and move_uploaded_file() should be before function convertPic().

Well, that's what I think on first sight.

Upvotes: 0

Marc B
Marc B

Reputation: 360842

It would appear that you're processing an uploaded image. As part of the processing function, you move the uploaded file from its temporary directory, and then do some work on it.

When you call the function again the second time, the uploaded file is not longer in the temporary directory, and things blow up.

function convertPic(...) {
    ....
    move_uploaded_file($_FILES['filename']['tmp_name'], $file_src);
    ....
    unlink($file_src);
    ....
}

Basically the first call to convertPic processes and then deletes the "source", which means it's no longer available for the second call immediately afterwards.

Upvotes: 1

Related Questions