Моя библиотека для работы с изображениями 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();
}