Как правильно сжимать изображение

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

На самом деле 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 комментариев

комментарий был удален
avatar
Отправил коммент блин)
1.
<img src="<?=base_url();?>/wall/<?=$cell['img']; ?>" alt="ЧО за гумно">

2.
<img src="test.ru/wall/<?=$cell['img']; ?>" alt="ЧО за гумно">

3.
<img src="<?=$_SERVER['DOCUMENT_ROOT'];?>/wall/<?=$cell['img']; ?>" alt="ЧО за гумно">
avatar
Используй лучше объекты!
При выборке данный, в SQL запросе пиши нет
->result_array()

а
->result()

Тогда в PHP смело можешь выводить не так
$cell['img'];

а так
$cell->img;

Ну это вобщем то качается красоты кода и удобства, если не нужен массив для каких то либо махинаций, лучше и чище будет выводить объектом данные.
Вместо
<?=base_url();?>

Пиши
<?php echo $this->config->base_url() ?>

Если нужно указать каталог «wall», то лучше писать так
<?php echo $this->config->base_url("wall") ?>

В твоем случае получится так
<img src="<?php $this->config->base_url("wall") ?>/<?php $cell->img ?>" alt="ЧО за гумно">

или даже лучше так
<img src="<?php $this->config->base_url("wall/" . $cell->img) ?>" alt="ЧО за гумно">


Если что то не отображается, включи ошибки 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
Гугл найдет что нужно =)
avatar
Это то всё работает, но они всё равно не отображаются, даже если картинку кинуть в каталог с файлом и просто написать
<img src="file.jpg">
не грузится, может в routes.php надо какой то доступ к каталогу с картинкой дописать?
avatar
походу дела в htaccess проблема
В htacces все удали и размести этот код

AddDefaultCharset UTF-8
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-l
  # Main URL rewriting.
  RewriteRule ^(.*)$ index.php?$1 [L,QSA]
</IfModule>
avatar
По теме: вообще не работает сжатие и обрезка, картинка загружается и никаких больше действий с ней не происходит, ошибок не выдает, на форуме пишут, что может оперативки не хватать, хотя на денвере 128мб выделено
avatar
ImageMagick установил на комп?
Нужно в настройках путь передать.
Должно работать.
avatar
Что то нигде нет нормальной инфы по установке, или всё десятилетней давности
avatar
по установке чего? Imagemagick?
Если тебе на винду надо поставить, так там наверняка .exe ставиться.
В linux так еще проще, sudo apt-get install imagemagik
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.