Моя библиотека для работы с изображениями CodeIgniter работает не так, как я хочу

У меня есть изображение. Я хочу, чтобы его размер был точно 500х250. Я также хочу сохранить соотношение изображений. Таким образом, мой план состоял в том, чтобы изменить его размер и затем обрезать. Мой код для изменения размера изображения приведен ниже.

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

Сейчас размер изображения становится 163х250. Я не могу понять, что не так с моим кодом.

2 ответа

Я не уверен, что ты image_lib но я думаю, что вы не учитываете соотношение сторон, которое становится меньше требуемых размеров при изменении размера.

Предположим, что есть изображение, скажем: 1000 х 300

Когда вы изменяете размер, он становится 500 х 150 (потому что вы поддерживаете соотношение сторон)

Когда вы обрежете его как 500 x 250, вы получите либо другой размер, либо искаженные изображения.

То, что вам нужно сделать, это динамически решить, какая сторона (высота или ширина) имеет меньшее значение, а затем изменить размер этой стороны, сохраняя соотношение сторон, а затем обрезать его. Таким образом, изображение всегда будет иметь достаточно содержимого для обрезки в указанных размерах.

Библиотека изображений доставила мне много головной боли - не потому, что это плохо, а потому, что мне приходится заново изучать, как это работает, каждый раз, когда я пытаюсь сделать что-то новое с этим. По крайней мере, для меня документация немного сложна для понимания.

В начале я также подумал, что имеет смысл изменить размер перед кадрированием. Я точно не помню, почему, но позже я обнаружил, что лучше сделать обратное. Я могу ошибаться, но мой код теперь работает нормально, поэтому я буду придерживаться этой стратегии.

Еще одна вещь, которая, на мой взгляд, важна, это установить для параметра 'keep_ratio' значение FALSE и выполнить вычисления самостоятельно.

Недавно я переписал свою функцию для изменения размера, и я думаю, что она в основном не требует пояснений, за исключением моей переменной $top_crop. Это моя "парикмахерская" переменная, которая пытается предположить, сколько нужно снять с вершины. В моем конфигурационном файле 'settings' он установлен на 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();
}
Другие вопросы по тегам