Изменение размеров фото PHP

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

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

Что бы облегчить «мучения» посетителей сайта и избавить веб мастера от рутинной работы по уменьшению размеров фото (ширины и высоты) была написана PHP функция ImageResize.
Данный php скрипт работает с библиотекой GD на стороне сервера и выполняет всю работу связанную с уменьшением размеров фото, получением превью быстро и качественно.

Теперь о том, как пользоваться функцией ImageResize на практике.

Размещаем PHP скрипт функции в файле function.php

<?php
/***********************************************************************************
Функция img_resize(): генерация thumbnails
Параметры:
  $src             - имя исходного файла
  $dest            - имя генерируемого файла
  $width, $height  - ширина и высота генерируемого изображения, в пикселях
Необязательные параметры:
  $rgb             - цвет фона, по умолчанию - белый
  $quality         - качество генерируемого JPEG, по умолчанию - максимальное (100)
***********************************************************************************/
function img_resize($src, $dest, $width, $height, $rgb = 0xFFFFFF, $quality = 100)
{  
	if (!file_exists($src))
		return false;

	$size = getimagesize($src);
	 
	if ($size === false)
		return false;

	$format = strtolower(substr($size['mime'], strpos($size['mime'], '/') + 1));
	$icfunc = 'imagecreatefrom'.$format;
	
	if (!function_exists($icfunc))
		return false;

	$x_ratio = $width  / $size[0];
	$y_ratio = $height / $size[1];
	
	if ($height == 0)
	{ 
		$y_ratio = $x_ratio;
		$height  = $y_ratio * $size[1];
	}
	elseif ($width == 0)
	{ 
		$x_ratio = $y_ratio;
		$width   = $x_ratio * $size[0];
	}
	
	$ratio       = min($x_ratio, $y_ratio);
	$use_x_ratio = ($x_ratio == $ratio);
	
	$new_width   = $use_x_ratio  ? $width  : floor($size[0] * $ratio);
	$new_height  = !$use_x_ratio ? $height : floor($size[1] * $ratio);
	$new_left    = $use_x_ratio  ? 0 : floor(($width - $new_width)   / 2);
	$new_top     = !$use_x_ratio ? 0 : floor(($height - $new_height) / 2);
	 
	// если не нужно увеличивать маленькую картинку до указанного размера
	if ($size[0]<$new_width && $size[1]<$new_height)
	{
		$width = $new_width = $size[0];
		$height = $new_height = $size[1];
	}

	$isrc  = $icfunc($src);
	$idest = imagecreatetruecolor($width, $height);
	 
	imagefill($idest, 0, 0, $rgb);
	imagecopyresampled($idest, $isrc, $new_left, $new_top, 0, 0, $new_width, $new_height, $size[0], $size[1]);

	$i = strrpos($dest,'.');
	if (!$i) return '';
	$l = strlen($dest) - $i;
	$ext = substr($dest,$i+1,$l);
	
	switch ($ext)
	{
		case 'jpeg':
		case 'jpg':
		imagejpeg($idest,$dest,$quality);
		break;
		case 'gif':
		imagegif($idest,$dest);
		break;
		case 'png':
		imagepng($idest,$dest);
		break;
	}

	imagedestroy($isrc);
	imagedestroy($idest);

	return true;  
}
?>

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

<?php
include("function.php"); // подключаем файл с функцией
    // Запускаем функцию
img_resize($src, $dest, 800, 600);
?>

В результате работы мы получим фото шириной – 800px, высотой – 600px.

Если нужен только один параметр, например ширина 800px, то высоту задаем равную 0 (ноль). При этом получим пропорциональное фото с шириной 800px.

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

Вопросы, отзывы и предложения оставляем в комментариях.

Комментарии по теме: "Изменение размеров фото PHP".

  1. автор Евгений

    Здравствуйте, я новичок в этом и что то совсем не понял, что куда указывать, и какие пути прописывать?

  2. автор Абай

    Спасибо большое, все работает, по ширине и высоте размеры точно выводится. А не знаете почему превью изображения не четкими становится, размеры у меня на сайте должно быть 206x120 пикселей, а я обрезаю их
    img_resize("userfiles/photos/gallery/$galleryimgName", "userfiles/photos/thumbs/$galleryimgName", 300, 170, $galleryimgExt);

  3. автор Евгений

    Проверьте пути на сервере
    userfiles/photos/tmp/$imgName
    userfiles/photos/img/$imgName

  4. автор Абай

    img_resize("userfiles/photos/tmp/$imgName", "userfiles/photos/img/$imgName", 300, 200); Не добавляется картинки.

  5. автор Андрей

    Большое спасибо за скрипт! Сколько искал, и наконец-то всё работает идеально! Еще раз спасибо за скрипт!

  6. автор Евгений

    В файле upload.php можно оставить:
    img_resize($src, $dest, 1000, 0);

  7. автор Валерий

    Заработало! Евгений, спасибо огромное за помощь! В конце функции uploadHandle требуется написать - return array('info' => $info, 'error' => $error, 'destination'=>$destination);. Перед функцией img_resize добавить -
    $file_name = time() . $_FILES['file']['name'];
    $src = $message['destination'];
    $dest = 'img_user/small/' . $file_name;
    В файле upload.php потребовалось прописать только: img_resize($message['destination'], 'img_user/small/' . $file_name, 1000, 0);
    Почему так - я объяснить не могу.

  8. автор Евгений

    $src = $message['destination'];
    $dest = 'img_user/small/';
    Эти две строчки надо разместить в файле upload.php перед
    img_resize($src, $dest, 1000, 0);

  9. автор Валерий

    Не работает. В начале функции img_resize указал: $src = $message['destination']; $dest = 'img_user/small/'; Создал на сервере внутри img_user папку small.

  10. автор Евгений

    Можно, если функция uploadHandle вернёт переменную $destination
    return array('info' => $info, 'error' => $error, 'destination'=>$destination);
    тогда
    $src = $message['destination'];

  11. автор Валерий

    Вместо $src = 'img_user/foto.jpg' можно ли в начале функции прописать $src = $destination; ?

  12. автор Евгений

    $src = 'img_user/foto.jpg'
    $src - путь к файлу, размеры которого необходимо изменить
    $dest = 'img_resize/foto.jpg'
    $dest - путь к файлу, с измененными размерами

  13. автор Валерий

    Я понимаю, что эта функция может применяться как дополнение к функции загрузки файлов на сервер uploadHandle ( http://www.wellsait.ru/articles/?url=upload_file). Значит $src = 'img_user/'; Тогда для $dest требуется создать новую папку. Тогда на сервере будет существовать две папки. Одна с фото больших размеров и другая - с уменьшенными размерами?

  14. автор Евгений

    Валерий, проверьте пути к файлам $src - имя исходного файла и $dest - имя генерируемого файла. Они должны существовать на сервере до запуска функции img_resize().

  15. автор Валерий

    Здравствуйте! Пользую Вашу форму загрузки файлов на сервер с функцией uploadHandle. Спасибо, все работает отлично! А с внедрением данной формы уменьшения размеров файлов столкнулся с неразрешимыми трудностями. Функцию img_resize я разместил в том же файле function.php, где имеется функция uploadHandle. А скрипт с вызовом этой функции вставлял в разные места, но результата нет. Я не силен в программировании. Пожалуйста, подскажите где и как требуется подключить функцию img_resize, чтобы работали обе функции uploadHandle и img_resize.

  16. автор Алексей

    ДА действительно, все работает как надо, только сервер загрузку больше 20 файлов не дает))), а так зачет! спасибо за скрипт

  17. автор Евгений

    Если $src - массив, то можно циклом все уменьшить

  18. автор Алексей

    А можно ли уменьшить сразу несколько файлов?

  19. автор Евгений

    Так с начало нужно загрузить на сервер, а потом уже редактировать.

  20. автор Алексей

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

  21. автор Евгений

    Александр, возможно не правильно указан путь к фото (фото должно открываться с сервера).

  22. автор Александр

    Столкнулся с проблемой: перестал работать скрипт. Загружаю фотки с одной папки и всё работает, а с остальных - нет. Кто то знает, как решить проблему?

  23. автор Евгений

    Большая просьба, оставлять сообщения только по данной теме. Спам, реклама и т.д. будут удаляться.

Добавить комментарий