Правильный ресайз изображений на PHP

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

Если рассмотреть типичные примеры функций по изменению размеров, то как правило происходит просто изменение размеров исходника таким образом, что либо сверху-снизу появляются белые полосы, либо соответственно справа-слева. В нашем же случае, если картинка вытянута по высоте, то соответственно без всяких полос она пропорционально обрежется сверху и снизу.

правильное изменение размеров на PHP

Если исходная картинка вытянута по ширине, то она обрежется по краям слева и справа.

ресайз картинок на PHP

Думаю проще всего посмотреть на результат работы функции по изменению размеров на PHP. Создайте два файла. Первый create.php будет принимать исходный файл и в нем же мы будем задавать выходные размеры. Второй файл, собственно и есть наша функция. Для примера будет менять размеры например для аватарки размером 100 x 100px.

create.php

<?php 
include 'image.inc.php';
header('Content-Type: image/png'); //или /png /gif, т.е то что нам надо
create_thumbnail('test.jpg', 'false', 100, 100);

image.inc.php

<?php 
function create_thumbnail($path, $save, $width, $height) {
	$info = getimagesize($path); //получаем размеры картинки и ее тип
	$size = array($info[0], $info[1]); //закидываем размеры в массив

        //В зависимости от расширения картинки вызываем соответствующую функцию
	if ($info['mime'] == 'image/png') {
		$src = imagecreatefrompng($path); //создаём новое изображение из файла
	} else if ($info['mime'] == 'image/jpeg') {
		$src = imagecreatefromjpeg($path);
	} else if ($info['mime'] == 'image/gif') {
 		$src = imagecreatefromgif($path);
	} else {
		return false;
	}

	$thumb = imagecreatetruecolor($width, $height); //возвращает идентификатор изображения, представляющий черное изображение заданного размера
	$src_aspect = $size[0] / $size[1]; //отношение ширины к высоте исходника
	$thumb_aspect = $width / $height; //отношение ширины к высоте аватарки

	if($src_aspect < $thumb_aspect) { 		//узкий вариант (фиксированная ширина) 		$scale = $width / $size[0]; 		$new_size = array($width, $width / $src_aspect); 		$src_pos = array(0, ($size[1] * $scale - $height) / $scale / 2); //Ищем расстояние по высоте от края картинки до начала картины после обрезки 	} else if ($src_aspect > $thumb_aspect) {
		//широкий вариант (фиксированная высота)
		$scale = $height / $size[1];
		$new_size = array($height * $src_aspect, $height);
		$src_pos = array(($size[0] * $scale - $width) / $scale / 2, 0); //Ищем расстояние по ширине от края картинки до начала картины после обрезки
	} else {
		//другое
		$new_size = array($width, $height);
		$src_pos = array(0,0);
	}

	$new_size[0] = max($new_size[0], 1);
	$new_size[1] = max($new_size[1], 1);

	imagecopyresampled($thumb, $src, 0, 0, $src_pos[0], $src_pos[1], $new_size[0], $new_size[1], $size[0], $size[1]);
	//Копирование и изменение размера изображения с ресемплированием

	if($save === false) {
		return imagepng($thumb); //Выводит JPEG/PNG/GIF изображение
	} else {
		return imagepng($thumb, $save);//Сохраняет JPEG/PNG/GIF изображение
	}

}

Думаю у вас получится разобраться с этой функцией по изменению размеров на PHP и она действительно пригодится вам в ваших проектах, либо вы поделитесь своим вариантом, который покажется вам еще более удобным и продвинутым.

Есть 8 коммент.

  1. User пишет:

    Ваще норм…

  2. George пишет:

    Отличная статься!
    Автору +100000 к карме)

  3. Павел пишет:

    Хм, а почему при загрузке вертикального изображения (размер задаю 100х200), он переворачивает изображение?

  4. Олеся пишет:

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

  5. Иван пишет:

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

  6. Шурик пишет:

    Вообще было бы удивительно, если бы говнокод работал.
    Но чудес не бывает :)

  7. Блохов пишет:

    Вы совсем забыли про прозрачные картинки https://intsystem.org/coding/correct-resize-transparent-images-on-php/ я пару часов бился и тупил из за этого.

  8. admin пишет:

    Спасибо, буду иметь ввиду!

Написать комментарий

XHTML: Вы можете использовать эти теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*

*