CodeIgniter使用轴调整大小和裁剪

时间:2012-11-22 10:09:37

标签: php codeigniter image-processing jcrop

我在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);

那么如何通过一次调用image_moo或CI image_lib来调整+使用CodeIgniter(或image_moo)方式的给定x / y偏移量进行裁剪?

你应该问我为什么要把它叫两次。嗯,PQ很重要,我担心因为调用它会降低图像质量。

提前致谢,

1 个答案:

答案 0 :(得分:8)

您给出的Codeigniter代码是正常的,除了一个逻辑:您正在操作并输出到同一个图像文件两次,因此您的输出文件会被最后一次更改原始文件所覆盖。

我认为这是CI的Image_Lib类的限制,因为每个操作都是单独完成的 - 没有办法一次性“调整大小和裁剪”。

您必须在每个操作之间重新初始化Image_Lib类,以确保在上一个操作的输出文件中调用下一个操作。

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

// Now change the input file to the one that just got resized
// See also $this->image_lib->clear()
$img_config['source_image'] = $save_to;
$this->image_lib->initialize($img_config); 

$this->image_lib->crop();

您还可以使用两个不同的配置数组:

$this->load->library('image_lib');

$this->image_lib->initialize(array(
    'source_image'      => $src,
    'new_image'         => $save_to,
    'maintain_ratio'    => false,
    'width'             => $targ_w,
    'height'            => $targ_h,
));
$this->image_lib->resize();

$this->image_lib->clear();

$this->image_lib->initialize(array(
    'source_image'      => $save_to,
    'x_axis'            => $_POST['x'],
    'y_axis'            => $_POST['y']
));
$this->image_lib->crop();

或者,您可以首先create the copy图像文件,然后在每次调用图像库类时对其进行操作,这样可以省去使用新source_image重新初始化的麻烦:

copy($src, $save_to);
$this->load->library('image_lib', array(
    'source_image'      => $save_to,
    'maintain_ratio'    => false,
    'width'             => $targ_w,
    'height'            => $targ_h,
    'x_axis'            => $_POST['x'],
    'y_axis'            => $_POST['y']
));
$this->image_lib->resize();
$this->image_lib->crop();