• Мой Twitter
    @ilyazh: Моя просьба была услышана! Дождя не было, но прохлада пришла! =) Спасибо.

PHP: пропорциональное уменьшение изображения

17 Авг 2009, Илья, 33 комментария

Фух. Наконец-то появилось свободное время — завершил все заказы по верстке, написал с нуля небольшой веб сервис (о нём я расскажу позже. В конце августа или в начале сентября), а теперь напишу небольшой урок по php. Хотя в дальнейшем я буду публиковать новые уроки по программированию. Буду рассматривать свои «старые» скрипты, а также делиться опытом в «прямом эфире» — т.е. научился чему-либо, попробую научить и вас.

Сегодня я разберу скрипт своего старого музыкального портала, который я написал в далёком 2005 году, когда ещё не кто и не мечтал о верстке дивами и все верстали таблицами. =) Тогда наверно и не существовало html-верстальщиков — ибо один человек мог напсать с нуля статическую домашнюю страничку и гордиться этим. icon mrgreen PHP: пропорциональное уменьшение изображения Следовательно, мой сайт был сверстан таблицами и у меня появилась проблема. Поскольку любой пользователь могу добавить в галерею сайта фотографии, то фотографий в галереи было много и они были разного размера, но фотогалерея сайта была задумана так, чтобы фотографии размещались по 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, ImageSX ($src), ImageSY ($src));
#Сохраняем полученное изображение в формате JPG
ImageJPEG ($dst, «small_photo.jpg», 100);
?>

Пример работы скрипта вы можете посмотреть здесь. Исходное изображение находится тут. Если хоите, то можете уменьшить любое другое изображение. Для этого передайте скрипту адрес изображения в виде http://www.zhitenev.ru/demo/img-resize/?photo=http://site.ru/1.jpg, где «http://site.ru/1.jpg» — путь к изображению.

Вот и всё. Для решения задачи нам потребовалось всего лишь 9 строк кода. Удачного вам кодинга и работающего кода. До следующего поста!

Рекомендуем посмотреть

Метки: , ,

33 комментария

« Предыдущие комментарии
  1. Денис:

    я так понял, что сначала надо загрузить, а потом уменьшать! спасибо за ответ!

  2. Dion:

    Спасибо за статью, всё доступно и понятно... Очень помогло мне ;-)

  3. revers:

    Только вот... А если изображение было менее 150 пикселей что оно с ним сделает?

    То что мы, вернее Вы ;-) ограничили ширину 150-ю пикселями это хорошо, но вот высота ведь ничем не ограничена?!!! А если кто то возьмёт и попробует загрузить на сервер изображение 200 на 10 000 пикселей? :???: :?:

    • Тогда оно уменьшиться до 150 на пропорциональную высоту. Данный скрипт предназначен чтобы уменьшать картинки, но не портить их пропорции.

      На сайте, для которого я делал этого скрипт, было важно чтобы картинки в 4 столбца не растягивали сайт в ширину, а в высоту можно.

Добавить ответ

Следуй за мной!

Follow Me! Follow Me! Follow Me!

Популярные записи

  1. Убираем визуальные закладки Яндекс в Firefox 3.5
  2. Возвращаем поиск Google в Firefox 3.5
  3. Трансляция блога и раздача инвайтов.
  4. Запускаю социальную сеть
  5. Переносим настройки Mozilla, делаем бэкап.

Статистика



Реклама