PHP: пропорциональное уменьшение изображения
Фух. Наконец-то появилось свободное время — завершил все заказы по верстке, написал с нуля небольшой веб сервис (о нём я расскажу позже. В конце августа или в начале сентября), а теперь напишу небольшой урок по php. Хотя в дальнейшем я буду публиковать новые уроки по программированию. Буду рассматривать свои «старые» скрипты, а также делиться опытом в «прямом эфире» — т.е. научился чему-либо, попробую научить и вас.
Сегодня я разберу скрипт своего старого музыкального портала, который я написал в далёком 2005 году, когда ещё никто и не мечтал о верстке дивами и все верстали таблицами. =) Тогда наверно и не существовало html-верстальщиков — ибо один человек мог написать с нуля статическую домашнюю страничку и гордиться этим.
Следовательно, мой сайт был сверстан таблицами и у меня появилась проблема. Поскольку любой пользователь мог добавить в галерею сайта фотографии, то фотографий в галерее было много и они были разного размера, но фотогалерея сайта была задумана так, чтобы фотографии размещались по 4 штуки на строку и было 5 строк на странице. Естественно, в полный размер фото бы не уместились и появился бы горизонтальный скролл. Тогда я решил написать скрипт, который при загрузке фото на сервер, создавал бы уменьшенную копию фотографии с шириной 150 пикселей, не теряя при этом пропорций фотографии. Забыл сказать, данный скрипт расчитан на jpg изображения т.к. подавляющее большинство фотографий делаются в этом формате.
Ниже представлен весь необходимый нам, для выполнения нашей задачи, код. Приступаю к комментированию.
<?php
//Определяем размер фотографии — ширину и высоту
$size=GetImageSize ("photo.jpg");
//Создаём новое изображение из «старого»
$src=ImageCreateFromJPEG ("photo.jpg");
//Берём числовое значение ширины фотографии, которое мы получили в первой строке и записываем это число в переменную
$iw=$size[0];
//Проделываем ту же операцию, что и в предыдущей строке, но только уже с высотой.
$ih=$size[1];
//Ширину фотографии делим на 150 т.к. на выходе мы хотим получить фото шириной в 150 пикселей. В результате получаем коэфициент соотношения ширины оригинала с будущей превьюшкой.
$koe=$iw/150;
//Делим высоту изображения на коэфициент, полученный в предыдущей строке, и округляем число до целого в большую сторону — в результате получаем высоту нового изображения.
$new_h=ceil ($ih/$koe);
//Создаём пустой изображени шириной в 150 пикселей и высотой, которую мы вычислили в предыдущей строке.
$dst=ImageCreateTrueColor (150, $new_h);
//Данная функция копирует прямоугольную часть изображения в другое изображение, плавно интерполируя пикселные значения таким образом, что, в частности, уменьшение размера изображения сохранит его чёткость и яркость.
ImageCopyResampled ($dst, $src, 0, 0, 0, 0, 150, $new_h, $iw, $ih);
//Сохраняем полученное изображение в формате JPG
ImageJPEG ($dst, "small_photo.jpg", 100);
imagedestroy($src);
?>
Пример работы скрипта вы можете посмотреть здесь. Исходное изображение находится тут. Если хотите, то можете уменьшить любое другое изображение. Для этого передайте скрипту адрес изображения в виде http://www.zhitenev.ru/demo/img-resize/?photo=http://site.ru/1.jpg, где «http://site.ru/1.jpg» — путь к изображению.
Вот и всё. Для решения задачи нам потребовалось всего лишь 9 строк кода. Удачного вам кодинга и работающего кода. До следующего поста!
Рекомендуем посмотреть
| Tweet |
Метки: программирование, сайт
я так понял, что сначала надо загрузить, а потом уменьшать! спасибо за ответ!
Да , именно так. Не за что.
Спасибо за статью, всё доступно и понятно... Очень помогло мне
Только вот... А если изображение было менее 150 пикселей что оно с ним сделает?
То что мы, вернее Вы
ограничили ширину 150-ю пикселями это хорошо, но вот высота ведь ничем не ограничена?!!! А если кто то возьмёт и попробует загрузить на сервер изображение 200 на 10 000 пикселей?
Тогда оно уменьшиться до 150 на пропорциональную высоту. Данный скрипт предназначен чтобы уменьшать картинки, но не портить их пропорции.
На сайте, для которого я делал этого скрипт, было важно чтобы картинки в 4 столбца не растягивали сайт в ширину, а в высоту можно.
Илья, так держать! Очень понятно. Спасибо)
Не за что. =) Стараюсь делать всё наиболее понятным.
Автору статьи большое спасибо ))
сам работу с картинками в пхп как ни старался — не осилил.
возникла точь в точь такая же задача как у тебя (за исключением того что я делаю wap сайт) — искал в интернете решение, но лучше чем у тебя не нашел ))
даже вроде понял немного )
Пожалуйста.
Большое спасибо статья очень помогла в работе )))))
не за что.
Интересно, а почему в 2005 никто не мечтал о верстке дивами? И почему не было верстальщиков? Может, вы просто мало тогда знали?
Верстальщики были, но подавляющее большинство сайтов было сверстано таблицами. Дивы уже использовали, но многие не знали или не хотели переделывать код своих сайтов только ради того, чтобы странички были написаны другим кодом
Классный урок, сейчас буду разбирать но по описанию все понятно вроде бы.
Хорошо бы еще работающий пример в архиве. Просто не все программисты есть и те кто учатся на этом.
Вопрос такой куда сохраниться картинка которая была обработана или мы ее на месте обрабатываем?
Все я во всем разобрался. Из того что я находил это самый простой пример пропорционального изменения размера изображения. Автор супер )))) с удовольствием буду следить за блогом.
Рад помочь)