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

Автор: Topol Вторник, Апрель 17th, 2012 Нет комментариев

Рубрика: Программирование

Высоко сижу… Далеко гляжу… И вижу, что на форуме, по крайней мере 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 часов. Но если бы такая статья была здесь раньше — то всё было бы намного проще.

Источник: woweb.ru

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты