Портал для веб-мастера
Вход пользователей
Поиск статей
WoWeb.ru » Статьи » Программирование для Web » PHP

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

Высоко сижу... Далеко гляжу... И вижу, что на форуме, по крайней мере 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 · Добавлена: 2005-10-29
Просмотров: 8105 · Рейтинг: 2.2

Всего комментариев: 2
[2] Сергей(white-nigger) 2010-04-27, 9:42 AM
да скрипт не работает ибо в нем пара ошибок. вот правильный и рабочий код.

<?php

if ($_GET['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($filename);
}
elseif(eregi(".png$",$_FILES[picture][name]))
{
$cop = imagecreatefrompng($filename);
}
elseif(eregi(".gif$",$_FILES[picture][name]))
{
$cop = imagecreatefromgif($filename);
}
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 "Всё успешно залито.";
} else {
//создаём формочку
print '<form enctype="multipart/form-data" action="index.php?action=add" method="POST">';
//а это на случай, если мы передаём новый 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>";
}

?>

не забудьте создать папки temp и big и выставить на них права 777 Спам


[1] Zzayac(Zzayac) 2008-03-07, 10:42 AM
Странный скрипт. Не работает. Очень жаль.. Спам

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Категории раздела
Flash
Apache
WWW
PhotoShop
Веб-дизайн
Раскрутка и реклама
Базы данных
3D графика
Хостинг
Истории веб-мастеров
Web-технологии
Сетевая безопасность
Программирование для Web
Операционные системы

Новые статьи
Лучшие статьи
Популярные статьи
Комментируемые статьи
Разделы сайта
Скрипты
Статьи
Шрифты
Флэш исходники
HTML шаблоны
Партнерки
Клипарты
Смайлы
Фоны
Гифы
Иконки
Опрос сайта
Ведете ли вы блог?
Всего ответов: 59961
Наша кнопка
WoWeb.ru - портал для веб-мастера