Сжимание изображений средствами php

Рабочий код для уменьшения веса изображений без потери качества

Александр

Автор

Иван

Фото

13
3

Каждый веб-разработчик рано или поздно сталкивается с проблемой медленной загрузки сайта. На скорость загрузки сайта влияет несколько причин, но самой распрастранённой конечно же является большое количество графических файлов, расположенных на страницах сайта. Зачастую, столкнувшись с данной проблемой, программисты сжимают все используемые на сайте изображения путём изменения качества или размера изображений в худшую сторону, используя специальные онлайн сервисы. Но что если на сайте должно присутствовать добавление контента пользователями, и любой пользователь сможет загрузить фото размером 7-8 МБ, тем самым увеличив скорость загрузки сайта. Именно для таких случаев у каждого веб-разработчика должна быть собственная библиотека (или просто функция) для работы с изображениями, а именно для сжатия качества картинок.

Если вы ещё не верите в существование подобной магической функции языка php, то внимательно посмотрите на следующий пример.

1.2 МБ

150 КБ

Вы видите разницу между этими двумя изображениями? Я - нет.

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

function resize_photo($path,$filename,$filesize,$type,$tmp_name){
	$quality = 60; //Качество в процентах. В данном случае будет сохранено 60% от начального качества.
	$size = 10485760; //Максимальный размер файла в байтах. В данном случае приблизительно 10 МБ.
	if($filesize>$size){
		switch($type){
			case 'image/jpeg': $source = imagecreatefromjpeg($tmp_name); break; //Создаём изображения по
			case 'image/png': $source = imagecreatefrompng($tmp_name); break;  //образцу загруженного   
			case 'image/gif': $source = imagecreatefromgif($tmp_name); break; //исходя из его формата
			default return false;
		}
		imagejpeg($source, $path.$filename, $quality); //Сохраняем созданное изображение по указанному пути в формате jpg
		imagedestroy($source);//Чистим память
		return true;
	}
	else return false;		
}

Вызов данной функции может быть примерно таким.

resize_photo('path/to/dir/','myfile.jpg',$_FILES['file']['size'],$_FILES['file']['type'],$_FILES['file']['tmp_name']);	

Вы можете поэкспериментировать с переменной $quality. Чем меньше вы установите её значение - тем меньше будет весить получившееся изображение, но не стоит сильно увлекаться, т.к. качество конечного изображения может сильно снизиться, если установить значение переменной ниже 40%.

Ниже представлен пример сжатия изображения со значением $quality=45.

880 КБ

120 КБ

Размер изображения уменьшился более чем в 8 раз! При этом потеря качества практически незаметна.

Ну и напоследок возьмём очень большое изображение и сожмём его со значением $quality=45.

7.9 МБ

440 КБ

Как видите, данная функция может творить чудеса! На этом всё. Сжимайте изображения и будьте счастливы.