PHP GD 图片裁剪功能

Posted

技术标签:

【中文标题】PHP GD 图片裁剪功能【英文标题】:PHP GD Image Cropping Function 【发布时间】:2011-03-28 15:40:06 【问题描述】:

我使用这段代码制作上传图片的缩略图。

   $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(资源 id #17, img.jpg, 0, 0, 0, 0, 250, 250, , )

我认为问题出在临时图像存储上,但不确定。请帮忙。

【问题讨论】:

【参考方案1】:

您似乎正在处理上传的图片。作为处理功能的一部分,您将上传的文件从其临时目录中移出,然后对其进行一些处理。

当你再次调用该函数时,上传的文件不再在临时目录中,事情就炸了。

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

基本上对 convertPic 的第一次调用会处理然后删除“源”,这意味着它不再可用于随后的第二次调用。

【讨论】:

【参考方案2】:

我猜问题出在 unlink($file_src)...

首先,您调用convertPic() 函数并且它工作正常,因为您的img.jpg 仍然在这里,然后您使用unlink() 删除您的图像并尝试再次调用实际上需要此文件才能正常工作的相同例程。

此外,您不能将同一个文件移动两次,因此您必须将其移到函数之外,根据需要多次执行您的工作,然后取消链接图像。取消链接应该在convertPic()的双重调用之后,move_uploaded_file()应该在函数convertPic()之前。

嗯,这就是我的第一印象。

【讨论】:

以上是关于PHP GD 图片裁剪功能的主要内容,如果未能解决你的问题,请参考以下文章

php图片上传类(支持缩放裁剪图片缩略功能)

php+ajax+flash 实现图片裁剪上传

给定图像和纵横比的最大裁剪区域

PHP 图像处理组件:Intervention/image

PHP 图像处理组件:Intervention/image

php裁剪图片