【问题标题】:CodeIgniter Resizing And Cropping With AxisCodeIgniter 使用 Axis 调整大小和裁剪
【发布时间】:2012-11-10 17:00:46
【问题描述】:

我在 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 很重要,我很担心,因为调用它两次会降低图像质量。

提前致谢,

【问题讨论】:

  • 您必须先进行裁剪,以获得正确的比例,然后再调整大小。在 Codeigniter 中,它们被拆分为单独的函数。
  • 是你的裁剪脚本作品......
  • @Jeemusu - 问题是我无法管理它。我应该先制作一个更大的缩略图,然后将其调整为所需的宽度/高度吗?能具体点吗?
  • @AnkurSaxena - 它自己工作,但还不够。不是每个 PHP 安装都有 GD2 等(我不会拥有这个脚本所在的服务器的管理权限,所以。)。 CodeIgniter 在后台管理这一切。这就是我想要 CI 方式的原因之一。另外,如果你问我,在 CI 脚本中包含所有 CI 方式会更好。
  • 对不起,我的朋友不介意。我也通过 gd lib 进行图像处理。我没有裁剪代码。

标签: php codeigniter image-processing jcrop


【解决方案1】:

除了一个逻辑之外,您给定的 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();

【讨论】:

  • 感谢您的回答,但我尽量避免两次调用库。你的答案正是我对 image_moo 所做的事情。那是我问这个问题的第一个地方。你确定不能同时调用 CI 的 image_lib 和 matmoo.com 的 image_moo 吗?
  • 使用 CI 的 Image_lib 绝对没有办法一次性完成。你试过 Image_Moo 中的resize_crop 方法吗? CI 库的一个要点是抽象一些功能,以便它可以与 GD/GD2、NetPBM 或 ImageMagick(如果您选择)一起使用。 Image_Moo 像您的原始代码一样仅使用 GD,您可能只想使用您似乎满意的原生 PHP 代码创建自己的函数并扩展 CI 的 Image_lib。不过,我很惊讶您注意到单独调用裁剪/调整大小会降低图像质量。
  • Image_moo 的 resize_crop 首先调整整张图片的大小,然后进行裁剪。所以这不是我真正想要的东西。如果我使用它,我需要重新计算调整大小的图像的尺寸、位置和宽度/高度以进行裁剪。我需要类似的东西,比如crop_resize :)
  • 啊,我明白了。您使用的“香草”代码简短而甜美,似乎可以满足您的需求。为什么不直接扩展 Image_lib 类并将其作为新方法添加?
  • 好吧,我担心它不会/可能无法在线工作。我将无法管理将要上传代码的服务器(可能不会安装 GD 或 GD2,所以我需要再次重写该代码),所以即使我已经使用 vanilla 代码扩展了 image_lib我的担忧仍然存在。无论如何,你澄清了我很多,所以我将你的答案标记为已接受,谢谢!
猜你喜欢
  • 2011-06-14
  • 1970-01-01
  • 2011-10-14
  • 2018-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-04
相关资源
最近更新 更多