Умный ресайз изображений
 

Высоко сижу... Далеко гляжу... И вижу, что на форуме, по крайней мере forum.woweb.ru (а на других я не бываю, ибо отстой всё остальное) одной из наиболее частых тем является ресайз картинок. 
Посмотрев большинство скриптов - с уверенностью могу сказать, что в большинстве допущена одна и та же ошибка. 
А именно: фотография не правильно уменьшается, то есть она либо уменьшается не пропорционально и вокруг изображения остаётся рамка, либо изображение уменьшается криво. 

Чаще всего это происходит из за того, что разработчики не хотят или не умеют посчитать новые размеры изображения. Возможно я в чём то не прав. Мозги у всех работают по разному. Но мной это было реализовано так и никак иначе. Потому, считаю своим долгом облегчить участь страждущих.


Изменение размера изображения.

//создаём формочку
print "<form enctype="multipart/form-data" action=somescript.php?action=add>";
//а это на случай, если мы передаём новый MAX размер из формы
//print "<input type=text name=w value=640>";
//print "<input type=text name=h value=480>";
print "<br><input type=file name=picture class=textbox><br><input type=submit class=button></form>";



if ($action==add)
{
//объявим имя для нового файла.
$time=time();
$mtime=microtime();
$mtime=str_replace(" ",'',$mtime);
$filename=$_SERVER['DOCUMENT_ROOT']."temp/$time.$mtime.tmp";
//теперь переместим его из темпа в тот файл который мы только что объявили
move_uploaded_file($_FILES[picture][tmp_name],$filename) or die('Невозможно скопировать файл');;
//Теперь определим тип файла, который мы залили
if(eregi(".jpg$|.jpeg$",$_FILES[picture][name]))
{
$cop = imagecreatefromJpeg($file_s);
}
elseif(eregi(".png$",$_FILES[picture][name]))
{
$cop = imagecreatefrompng($file_s);
}
elseif(eregi(".gif$",$_FILES[picture][name]))
{
$cop = imagecreatefromgif($file_s);
}
else
{
//если зелито что то не то, то он пошлёт нафиг и удалит залитое
die("Неправильный формат картинки");
@chmod($filaneme,0777);
@unlink($filename);
}
//определим размер картинки
$size = getimagesize($filename);

//Укажем новые размеры картинки, не более которых она должна быть
//Если угодно, то их можно передать из формы или _getом
//как раз на этот случай закомментировано 2 строчки
//$max_width=$w;
//$max_height=$h;

$max_width='640';
$max_height='480';

//посчитаем новые размеры картинки
$width=$size[0];
$height=$size[1];

$x_ratio = $max_width / $width;
$y_ratio = $max_height / $height;
if ( ($width <= $max_width) && ($height <= $max_height) )
{
$tn_width = $width;
$tn_height = $height;
}
else if (($x_ratio * $height) < $max_height)
{
$tn_height = $x_ratio * $height;
$tn_width = $max_width;
}
else
{
$tn_width = $y_ratio * $width;
$tn_height = $max_height;
}
//теперь преобразуем его в новое изображение

$time=time();
$mtime=microtime();
$mtime=str_replace(" ",'',$mtime);
$filename2="$time.$mtime.jpg";
$trumb = imagecreatetruecolor($tn_width, $tn_height);
$image=imagecopyresized($trumb, $cop, 0, 0, 0, 0, $tn_width, $tn_height, $width,$height);
//хочу обратить внимение, что последним параметром (35) мы уменьшаем
//качество изображения.
//чтобы этого не делать поставьте "-1"
ImageJpeg($trumb,$_SERVER['DOCUMENT_ROOT']."big/$filename2",35);
ImageDestroy($trumb);
//Если нам угодно, то мы можем повторить предыдущий процесс
//чтобы сгенерировать кроме просто ресайзиного изображения
//ещё и тумбочку, но тут и ежу понятно. И только после этого мы
//освобождаем память
ImageDestroy($cop);
//и удаляем временный файл
@chmod($filaneme,0777);
@unlink($filename);
print "Всё успешно залито.";
}

Вот и всё. Всё предельно просто и легко. 
Мне это было необходимо для скрипта сайта знакомств, разбирался около 6 часов. Но если бы такая статья была здесь раньше - то всё было бы намного проще.

Для любителей надергать статьи с чужих сайтов:
Эта статья была написана исключительно для сайта http://www.woweb.ru/
Если вы поместили её на свой сайт без разрешения администрации woweb.ru.

 
Автор: Garfield
 
Оригинал статьи: http://www.woweb.ru/publ/59-1-0-501