我的CodeIgniter图像处理库没有按照我想要的方式工作

时间:2013-05-02 18:01:18

标签: php codeigniter image-manipulation crop

我有一张图片。我希望它的大小正好是500x250。我也想保持图像比例。所以我的计划是重新调整大小然后裁剪。下面给出了调整图像大小的代码。

$config['image_library'] = 'gd2';
$config['source_image'] = './pictures/'.$pic_name;
$config['maintain_ratio'] = TRUE;
$config['width'] = 500;
$this->load->library('image_lib', $config);
$this->image_lib->resize();

调整大小后,图像大小为500x768。然后我试图裁剪它。裁剪代码如下。

$config['image_library'] = 'gd2';
$config['source_image'] = './pictures/'.$pic_name;
$config['x_axis'] = '0';
$config['y_axis'] = '0';
$config['height'] = 250;
$config['width'] = 500;
$this->image_lib->initialize($config); 
$this->image_lib->crop();

现在图像的大小变为163x250。我无法弄清楚我的代码有什么问题。

2 个答案:

答案 0 :(得分:0)

我不确定你的image_lib是做什么的,但我认为在调整大小时,你不会考虑宽高比变得小于所需的尺寸。

假设有一张图片说:1000 x 300

当你调整大小时,它变成500 x 150(因为你保持纵横比)

当您将其裁剪为500 x 250时,您最终会得到不同的尺寸或图像偏斜。

您需要做的是,动态决定哪一侧(高度或宽度)具有较小的值,然后调整到保持纵横比的那一侧,然后裁剪它。这样,图像将始终具有足够的内容,以上述尺寸裁剪。

答案 1 :(得分:0)

图像库给我带来了很多麻烦 - 不是因为它很糟糕,而是因为每次我尝试用它做新事物时我都要重新学习它是如何工作的。至少对我来说,文档有点难以理解。

一开始,我还认为在裁剪之前调整大小更有意义。我不记得确切原因,但我后来发现做相反的事情会更好。我可能会误解,但我的代码现在工作正常,所以我会坚持这个策略。

我认为另一件重要的事情是将'maintain_ratio'设置为FALSE并自行进行计算。

我最近重新编写了调整大小的函数,我认为除了我的变量$ top_crop之外,它几乎是不言自明的。这是我的“理发师”变量,它试图假设从顶部起飞多少。在我的配置文件'设置'中,我将其设置为20.这意味着在要裁剪的总金额中,从顶部取20%。换句话说,如果你裁剪100px,从顶部拿20,从底部拿80。

无论如何,这是我的裁剪代码。您可以使用它并根据您的需要进行调整:

function resize_img($data){
    if ($data['width'] == 0 || $data['height'] == 0){
        return FALSE;
    }
    $this->config->load('settings');
    $ratio = $data['height']/$data['width'];
    $targ_ratio = $data['max_ht']/$data['max_wd'];
    $top_crop = $this->config->item('crop_top');
    if ($targ_ratio >= $ratio){
        //too wide
        $crop_width = floor($data['height'] / $targ_ratio);
        $crop_height = $data['height'];
    } else {
        //too tall
        $crop_width = $data['width'];
        $crop_height = floor($data['width'] * $targ_ratio);
    }
    $img_data = array(  'source_image'      =>  $data['full_path'],
                        'maintain_ratio'    =>  FALSE,
                        'x_axis'            =>  round(($data['width'] - $crop_width)/2),
                        'y_axis'            =>  round(($data['height'] - $crop_height)*$top_crop/100),
                        'width'             =>  $crop_width,
                        'height'            =>  $crop_height);
    //thumbs have a target path
    if ($data['target_path']){
            $img_data['new_image'] = $data['target_path'];
            //set source for the crop, because for thumbs it will be the thumb folder
            $source = $data['target_path'].$data['file_name'];
    } else {
            $source = $data['full_path'];
    }
    $this->image_lib->clear();
    $this->image_lib->initialize($img_data);
    if ($this->image_lib->crop()){
        $img_data = array(  'source_image'  =>  $source,
                            'maintain_ratio'    =>  FALSE,
                            'width'             =>  $data['max_wd'],
                            'height'        =>  $data['max_ht']);
        $this->image_lib->clear();
        $this->image_lib->initialize($img_data);
        if($this->image_lib->resize()){
            return array('height' => $data['max_ht'], 'width' => $data['max_wd']);
        }
    }
    return $this->image_lib->display_errors();
}