Функция обрезки изображений PHP GD - PullRequest
0 голосов
/ 28 марта 2011

Я использую этот фрагмент кода для создания эскизов загруженного изображения.

   $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);

Но по какой-то причине функция convertPic не работает, если вызывается дважды, как в примере выше. Если он вызывается один раз, все работает нормально. Я поставил предупреждение, если imagecopyresampled не удается и выдает

imagecopyresampled (идентификатор ресурса № 17, img.jpg, 0, 0, 0, 0, 250, 250,,)

Я думаю, что проблема с временным хранением изображения, но не уверен. Пожалуйста, помогите.

Ответы [ 2 ]

1 голос
/ 28 марта 2011

Может показаться, что вы обрабатываете загруженное изображение.В рамках функции обработки вы перемещаете загруженный файл из его временного каталога, а затем выполняете некоторую работу с ним.

При повторном вызове функции загруженный файл больше не находится во временном каталоге.каталог, и все взрывается.

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

В основном первый вызов процессов convertPic, а затем удаляется «источник», что означает, что он больше не доступен для второго вызова сразу после этого.

0 голосов
/ 28 марта 2011

Я думаю, проблема в unlink ($ file_src) ...

Сначала вы вызываете функцию convertPic(), и она работает нормально, потому что ваш img.jpg все еще здесь, затем вы удаляете свое изображение с помощью unlink() и попробуйте снова вызвать ту же процедуру, которая действительно нуждается в этом файле для правильной работы.

Также вы не можете переместить один и тот же файл дважды, поэтому вы должны переместить его за пределы функции, выполнять свою работу столько разпо мере необходимости и после этого снимите связь с изображением.Разъединение должно быть после двойного вызова convertPic(), а move_uploaded_file() должно быть перед функцией convertPic().

Ну, это то, что я думаю на первый взгляд.

...