Мастерская iPloGic
+7 (926) 961-66-26

 — База знаний — Как изменить размер изображения средствами PHP

Как изменить размер изображения средствами PHP

В этой статье мы рассмотрим как можно изменять размер изображения средствами библиотеки GD, входящей в стандартный набор пакета PHP.

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

Мы не будем глубоко вдаваться в функционал используемой здесь библиотеки GD. Этому мы посвятим в последующем отдельную статью.

Итак. Перейдем к делу.

Код функции:

<?

function changeImageSize($filename, $savepath, $ext, $neww, $newh)
{
    $idata = getimagesize($filename);
    $oldw = $idata[0];
    $oldh = $idata[1];
    $ext = strtolower($ext);
    $ratio = calkRatio($oldw, $oldh, $neww, $newh);
    if($ext =='jpg' or $ext =='jpeg') { 
        $im = @imagecreatefromjpeg($filename);
    } 
    elseif ($ext =='gif') { 
    	$im=imagecreatefromgif($filename);
    } 
    elseif($ext=='png') { 
    	$im=imagecreatefrompng($filename);
    }
    if ($im) {
        $dest=imagecreatetruecolor($oldw/$ratio,$oldh/$ratio);
        $white = ImageColorAllocate($dest, 255,255,255);
        imagefill($dest, 1, 1, $white);
        imagecopyresampled($dest, $im, 0, 0, 0, 0, $oldw/$ratio, $oldh/$ratio, $oldw, $oldh);
	    if($ext =='jpg' or $ext =='jpeg') { 
            imageJPeG($dest, $savepath);
	    } 
	    elseif ($ext =='gif') { 
            imagegif($dest, $savepath);
	    } 
	    elseif($ext =='png') { 
	            imagepng($dest, $savepath);
	    } 
        imageDestroy($im);
        imageDestroy($dest);
        return true;
    }      
    return false;
}
  

/*
функция вычисления коэффициента сжатия/растяжения исходного изображения
*/  
function calkRatio($old_width, $old_height, $new_width, $new_height) {
	(double)$ratiow = (double)$old_width/ (double)$new_width;
	(double)$ratioh = (double)$old_height/ (double)$new_height;
	if ( $ratiow < 1 && $ratioh < 1 ) {
		if( $ratiow > $ratioh ) { $this->ratio = $ratiow; }
		else { $ratio = $ratioh; }
	}
	elseif ( $ratiow > 1 && $ratioh > 1 ) {
		if( $ratiow < $ratioh ) { $ratio = $ratioh; }
		else { $ratio = $ratiow; }
	}
	elseif ( $ratiow > 1 && $ratioh == 1 ) {
		$ratio = $ratiow;
	}
	elseif ( $ratiow < 1 && $ratioh == 1 ) {
		$ratio = $ratioh;
	}
	elseif ( $ratiow >= 1 && $ratioh < 1 ) {
		$ratio = $ratiow;
	}
	elseif ( $ratiow <= 1 && $ratioh > 1 ) {
		$ratio = $ratioh;
	}
	elseif ( $ratiow == 1 && $ratioh == 1 ) {
		$ratio = 1;
	}
	return $ratio;
}  

?>

Теперь объясним как с этим работать.

Чтобы не путать лишними строками читателя мы вынесли за скобки определение расширениня файла. Можно определять его и внутри функции. Это просто вырезание части строки после последней точки, азы, так что останавливаться не будем. Здесь только стоит заметить, что расширение не всегда соответствует реальному положению вещей. Например, если gif файлу присвоить расширение jpg, то для браузера ничего не изменится, он нормально будет показывать эту картинку, а вот библиотека GD здесь выдаст ошибку. Есть и другие способы определить действительный тип изображения, но здесь мы это рассматривать не будем.

Теперь разберем передаваемые в функцию переменные.

$filename - путь к директории и имя файла изображения

$savepath - путь к директории и имя файла, куда будет сохранен файл с новыми размерами

$ext - расширение файла без точки

$neww - ширина создаваемого изображения в точках

$newh - высота создаваемого изображения в точках

Теперь пример использования функции

<?
changeImageSize('/img1/qwerty.png', '/img2/ytrewq.png', 'png', 180, 120);
?>

Таким образом наша функция возьмет из папки img1 файл с именем qwerty.png, изменит его размеры на 180х120 и положит его в папку img2 под именем ytrewq.png.

Вот, собственно, и всё. Пользуйтесь.


18.06.2011