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 строк кода. Удачного вам кодинга и работающего кода. До следующего поста!

94 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
15 лет назад

А можно примерчик или демо какое нибудь? 🙂

15 лет назад

😛 Вот именно это я и искал. Спасибо.

15 лет назад

спасибо и пример даже есть

Михаил
14 лет назад

Только по моему тут опечатка в строке $src=ImageCreateFromJPEG (“photos.jpg”);
Должно быть $src=ImageCreateFromJPEG (“photo.jpg”);

14 лет назад

Все коротко просто и ясно. Воспользуюсь с разрешения автора на своем сайте 🙂

Макс
14 лет назад

Все гениальное просто! Спасибо.