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, 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 строк кода. Удачного вам кодинга и работающего кода. До следующего поста!
Рекомендуем посмотреть
Метки: php, программирование, сайт
я так понял, что сначала надо загрузить, а потом уменьшать! спасибо за ответ!
Да , именно так. Не за что.
Спасибо за статью, всё доступно и понятно... Очень помогло мне
Только вот... А если изображение было менее 150 пикселей что оно с ним сделает?
То что мы, вернее Вы
ограничили ширину 150-ю пикселями это хорошо, но вот высота ведь ничем не ограничена?!!! А если кто то возьмёт и попробует загрузить на сервер изображение 200 на 10 000 пикселей?
Тогда оно уменьшиться до 150 на пропорциональную высоту. Данный скрипт предназначен чтобы уменьшать картинки, но не портить их пропорции.
На сайте, для которого я делал этого скрипт, было важно чтобы картинки в 4 столбца не растягивали сайт в ширину, а в высоту можно.