我在CodeIgniter项目中使用了一个图片裁剪器,它可以像picresize.com(我使用jCrop)一样裁剪图片。下面是原始代码:
<?php
$save_to = $this->config->item('images_gallery_thumb_folder').$data['photo_image'];
$targ_w = $this->config->item('gallery_thumb_width');
$targ_h = $this->config->item('gallery_thumb_height');
$src = $this->config->item('images_gallery_folder').$data['photo_image'];
$types = array(1 => 'gif', 'jpeg', 'png');
list($width,$height,$type) = getimagesize($src);
switch ($types[$type]) {
case 'jpeg':
$img_r = imagecreatefromjpeg($src);
break;
case 'gif':
$img_r = imagecreatefromgif($src);
break;
case 'png':
$img_r = imagecreatefrompng($src);
break;
default:
$img_r = imagecreatefromjpeg($src);
break;
}
$dst_r = ImageCreateTrueColor($targ_w,$targ_h );
imagecopyresampled($dst_r,$img_r,0,0,$_POST['x'],$_POST['y'],
$targ_w,$targ_h,$_POST['w'],$_POST['h']);
switch ($types[$type]) {
case 'jpeg':
imagejpeg($dst_r, $save_to, 90); //90 = jpeg quality
break;
case 'gif':
imagegif($dst_r, $save_to);
break;
case 'png':
imagepng($dst_r, $save_to);
break;
default:
imagejpeg($dst_r, $save_to, 90); //90 = jpeg quality
break;
}
imagedestroy($dst_r);
?>
但我希望按照CodeIgniter的方式来处理这个问题。
到目前为止,这是我想出的方案:
<?php
$img_config = array(
'source_image' => $src,
'new_image' => $save_to,
'maintain_ratio' => false,
'width' => $targ_w,
'height' => $targ_h,
'x_axis' => $_POST['x'],
'y_axis' => $_POST['y']
);
$this->load->library('image_lib',$img_config);
//$this->image_lib->resize();
$this->image_lib->crop();
?>
事实上,它从位置进行裁剪,但不会调整大小(类似于我设置了一个更大的裁剪正方形)。它只从给定的位置进行裁剪。
我在项目中还使用image_moo库,但我也无法成功。 编辑: 在Image_moo中,这是我到目前为止想出的代码:
$this->image_moo
->load($src)
->crop($_POST['x'],$_POST['y'],($_POST['x']+$_POST['w']),($_POST['y']+$_POST['h']))
->resize($targ_w,$targ_h)
->save($save_to,true);
问题在于,当我使用resize参数时,它完全忽略了裁剪线并调整整个图像的大小。如果我先调整大小再调用裁剪,它就会失败。我可以通过使用两个image_moo调用来克服这个问题,但我不想这样做。
这也行不通:
$this->image_moo
->load($src)
->crop($_POST['x'],$_POST['y'],($_POST['x']+$_POST['w']),($_POST['y']+$_POST['h']))
//->resize($targ_w,$targ_h)
->save($save_to,true)
->resize($targ_w,$targ_h)
->save($save_to,true);
例如:这样它就能工作:
$this->image_moo
->load($src)
->crop($_POST['x'],$_POST['y'],($_POST['x']+$_POST['w']),($_POST['y']+$_POST['h']))
//->resize($targ_w,$targ_h)
->save($save_to,true);
$this->image_moo
->load($save_to)
->resize($targ_w,$targ_h)
->save($save_to,true);
如何使用CodeIgniter(或image_moo)一次调用来进行给定x/y偏移量的缩放+裁剪?
你可能会问为什么我要担心调用两次。嗯,PQ很重要,我担心调用两次会降低图像质量。
提前致谢。