Как правильно сжимать изображение
Возможно кому то это будет интересно, к примеру тем кто только начал осваивать фреймворк Codeigniter и пытается сделать загрузку изображений на своем сайте.
На самом деле Codeigniter предоставляет полный спектр возможностей по работе над изображениями, это и сжатие и crop, а так же наложение водяных знаком в виде текста или же картинки.
Но суть поста не об этом, а о том как же правильно обрезать/сжать изображение, чтобы получить нужный размер ширины и высоты.
Первым делом необходимо подгрузить библиотеку image_lib, откройте файл autoload.php в папке config и припишите данную библиотеку.
Далее работаем только в контроллере.
Чтобы изображение было вырезано правильно, а не каким нибудь куском, его необходимо сжать, а уже потом обрезать.
Так что у нас должна получиться некая цепочка обработки изображения.
Давайте начнем.
Предположим у вас есть форма с input[type=file]
После sybmit приняли наше изображение $_FILE и поместили его в переменную $image.
Теперь самое интересное нам необходимо так же указать master_dim, master_dim — устанавливает по какой из сторон нам нужно сжимать картинку.
Чтобы правильно определить сторону, а ширина и высота картинок может быть разной, у одной высота больше, у другой ширина больше и если нам указать по высоте, то одна из картинок будет обрезана неправильно и вместо 120х500, мы получим изображение 50х500, поэтому нужно четко знать какая сторона больше другой.
Для этого, первым делом нам нужно узнать ширину и высоту изображения
$size = getimagesize($image);
где $size[0] — ширина, а $size[1] высота, я предпочитаю пользоваться list($w, $h) для этого дела, но пост не об этом.
Теперь нам нужно все рассчитать, мы знаем размер изображения, а так же размер который нам нужно получить.
Пишем небольшую формулу для вычисления
Теперь скрипт будет знать что высота больше ширины и нужно указать сжатие по ширине или наоборот.
добавляем перед выполнение строку
После инициализации и выполнения ресайза мы получим картинку сжатую по меньшей стороне, а большую сторону нам необходимо обрезать.
После выполнения ресайза не забывайте о очистке массива $config
Теперь настало время crop
У нас есть новая картинка $new_image, путь к которой мы указали при ресайзе
Подготавливаем настройки для crop
Так как мы явно не знаем размера нового изображения, нам нужно опять получить информацию о нем.
Crop по умолчанию в Codeigniter обрезает картинку слева, но тогда на картинке будет не совсем то что мы хотели бы увидеть, для этого необходимо указать ширину или высоту изображения, а так же сколько нужно обрезать по той или иной стороне, сравнив два размера, картинки после ресайза и что нужно получить, нам необходимо разделить полученный размер пополам.
Теперь определить сторону по какой же стороне нам резать изображение
И последним шагом будет сама обрезка картинки
Вот собственно и все, теперь не важно каким размером было первоначальное изображение, хоть 500х2000 или же 2000х500, мы получим нужной нам размер 120х500 и при этом картинка будет картинкой, а не выпиленным куском изображения.
Надеюсь найдутся те кому этот пост поможет!
На самом деле Codeigniter предоставляет полный спектр возможностей по работе над изображениями, это и сжатие и crop, а так же наложение водяных знаком в виде текста или же картинки.
Но суть поста не об этом, а о том как же правильно обрезать/сжать изображение, чтобы получить нужный размер ширины и высоты.
Первым делом необходимо подгрузить библиотеку image_lib, откройте файл autoload.php в папке config и припишите данную библиотеку.
Далее работаем только в контроллере.
Чтобы изображение было вырезано правильно, а не каким нибудь куском, его необходимо сжать, а уже потом обрезать.
Так что у нас должна получиться некая цепочка обработки изображения.
Давайте начнем.
Предположим у вас есть форма с input[type=file]
После sybmit приняли наше изображение $_FILE и поместили его в переменную $image.
$config['image_library'] = 'gd2';
$config['source_image'] = $image; //'/path/to/image/mypic.jpg';
$config['new_image'] = 'путь к новому изображению';
$config['create_thumb'] = FALSE;
$config['maintain_ratio'] = TRUE;
$config['width'] = 120;
$config['height'] = 500;
$this->load->library('image_lib', $config);
$this->image_lib->resize();
Теперь самое интересное нам необходимо так же указать master_dim, master_dim — устанавливает по какой из сторон нам нужно сжимать картинку.
Чтобы правильно определить сторону, а ширина и высота картинок может быть разной, у одной высота больше, у другой ширина больше и если нам указать по высоте, то одна из картинок будет обрезана неправильно и вместо 120х500, мы получим изображение 50х500, поэтому нужно четко знать какая сторона больше другой.
У вас есть идеи по разработке вашего бизнес плана? Есть интересные компании которые помогают вам реализовать ваш бизнес план и поддержать в трудные минуты осуществления вашей мечты по бизнесу бізнес план україна.
Для этого, первым делом нам нужно узнать ширину и высоту изображения
$size = getimagesize($image);
где $size[0] — ширина, а $size[1] высота, я предпочитаю пользоваться list($w, $h) для этого дела, но пост не об этом.
Теперь нам нужно все рассчитать, мы знаем размер изображения, а так же размер который нам нужно получить.
Пишем небольшую формулу для вычисления
$master_dim = (($size[0] / $size[1]) - ($data['width'] / $data['height'])) < 0 ? 'width' : 'height';
Теперь скрипт будет знать что высота больше ширины и нужно указать сжатие по ширине или наоборот.
добавляем перед выполнение строку
$config['master_dim'] = $master_dim;
После инициализации и выполнения ресайза мы получим картинку сжатую по меньшей стороне, а большую сторону нам необходимо обрезать.
После выполнения ресайза не забывайте о очистке массива $config
$this->image_lib->clear();
Теперь настало время crop
У нас есть новая картинка $new_image, путь к которой мы указали при ресайзе
$config['new_image'] = 'путь к новому изображению';
Подготавливаем настройки для crop
Так как мы явно не знаем размера нового изображения, нам нужно опять получить информацию о нем.
$image = getimagesize($new_image);
Crop по умолчанию в Codeigniter обрезает картинку слева, но тогда на картинке будет не совсем то что мы хотели бы увидеть, для этого необходимо указать ширину или высоту изображения, а так же сколько нужно обрезать по той или иной стороне, сравнив два размера, картинки после ресайза и что нужно получить, нам необходимо разделить полученный размер пополам.
$data['x_axis'] = ($image[0] - $data['width']) > 0 ? ($image[0] - $data['width']) / 2 : 0;
$data['y_axis'] = ($image[1] - $data['height']) > 0 ? ($image[1] - $data['height']) / 2 : 0;
Теперь определить сторону по какой же стороне нам резать изображение
if($data['x_axis'] > 0)
{
$config['width'] = $data['width'];
}
if($data['y_axis'] > 0)
{
$config['height'] = $data['height'];
}
И последним шагом будет сама обрезка картинки
$config['image_library'] = 'ImageMagick';
$config['library_path'] = /usr/bil/ImageMagick_lib;
$config['source_image'] = $new_image;
$config['quality'] = 100;
$config['x_axis'] = $data['x_axis'];
$config['y_axis'] = $data['y_axis'];
$this->image_lib->initialize($config);
if ( ! $this->image_lib->crop())
{
return $this->image_lib->display_errors();
}
$this->image_lib->clear();
Вот собственно и все, теперь не важно каким размером было первоначальное изображение, хоть 500х2000 или же 2000х500, мы получим нужной нам размер 120х500 и при этом картинка будет картинкой, а не выпиленным куском изображения.
Надеюсь найдутся те кому этот пост поможет!
9 комментариев
1.
2.
3.
При выборке данный, в SQL запросе пиши нет
а
Тогда в PHP смело можешь выводить не так
а так
Ну это вобщем то качается красоты кода и удобства, если не нужен массив для каких то либо махинаций, лучше и чище будет выводить объектом данные.
Вместо
Пиши
Если нужно указать каталог «wall», то лучше писать так
В твоем случае получится так
или даже лучше так
Если что то не отображается, включи ошибки php в файле index.php (в корневой директории лежит) и если не понятно выкладывай сюда, помогу.
Еще не мало важно в CI есть стандартное профилирование, в контроллере можешь включить его
cidocs.ru/210/general/profiling.html
Да и вобще cidocs.ru очень поможет тебе в изучении CI, там вся поднаготная, вся дока по фрейму. НЕ читай все сразу, все равно в голове все не уложится, нужно потихоньку впитывать то что необходимо. Там кстати есть еще поиск от google, очень помогает, делаешь запрос ввиде
www.google.com/search?as_sitesearch=cidocs.ru%2F&q=%D1%84%D0%BE%D1%80%D0%BC%D0%B0+%D0%B2%D0%B0%D0%BB%D0%B8%D0%B4%D0%B0%D1%86%D0%B8%D1%8F&sa=Go
Гугл найдет что нужно =)
не грузится, может в routes.php надо какой то доступ к каталогу с картинкой дописать?
В htacces все удали и размести этот код
Нужно в настройках путь передать.
Должно работать.
Если тебе на винду надо поставить, так там наверняка .exe ставиться.
В linux так еще проще, sudo apt-get install imagemagik