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);
?>

Читать полностью

Создаем BBCode для WordPress

Wordpress logo WordPress — популярный блоговый движок. Кстати, сегодня (28 апреля 2009 года) wordpress’у исполняется 6 лет, как проекту. Поздравляем команду разработчиков нашей (по крайней мере для блогеров) любимой cms! Ну больше о нём я нечего вам не буду говорить т.к. сами знаете, а если не знаете, то без труда можете узнать на любом углу. Данная статья будет первой моей статьёй касаемо данной системы управления контентом (cms). Надеюсь, что помидорами не закидаете. Создаем BBCode для WordPress Итак, попробую начать.

Читать полностью

Проблемы с toobplayer или пишем парсер для youtube

28 марта, если тут имеются посетители моего сайта видео-концертов, то они (или вы:wink:) заметили, что большая часть видео перестала показываться. Вместо обычной буфферизации, за которые следовало воспроизведение видео, пользователи получали сообщение о пыпытке соедениться, а затем ужасную красную надпись «Не влезай, убьёт!» «error». Я написал разработчику плеера, он пообещал разобраться, но после двух суток проблема так и не была решена. К тому-же, общение с разработчиком было усложнено тем, что он иностранец и оно происходило на ломаном английском.

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

  1. Время шло, а большая часть видео не работало. Ппосетители пришедшие на сайт хотят смотреть видео прямо сейчас, а не ждать неопределённое время, следовательно я терял посетителей с каждым часом. К тому-же, как на зло, на вчера пришёлся рекорд посещаемости.
  2. Со временем всё сильнее и сильнее мне надоедало моё бессилие, к тому-же на сайте разработчика можно было скачать исходник данного скрипта. Да и php,можно сказать, родной мне язык т.к. многое я на нём сотворил, хотя на звание профи не претендую.

Скачав данный скрипт я начал разбиратся, но далеко я не ущёл т.к. увидел, что скрипт берёт данные из какого-то youtube‘овского url и проследовал по нему. Как оказалось, скрипт «высасывал» из данного url ключ сессии и путь к картинке-превью, а затем выводил их в удобном для флэш —  xml виде. Я проверил работу скрипта — ключ он выводит и картинку тоже, но т.к. этот ключ главная задача скрипта, то я стал разбираться почему видео не показываются. Я отправился на videosaver.ru и вставив туда адрес ролика получил ссылку на скачивание, которую я сравнил со ссылкой, в которую подставил данные «высосанные» скриптом. В результате ссылка полученная скриптом — не работает, а с помощью videosaver.ru — работает. Но тут мне стало жутко лень разбираться почему скрипт не работает и я решил написать свой скрипт, который берёт данные немного из другого источника, а затем выводит их в том-же, более понятном для флэша, xml виде. Суть скрипта очень проста. Скрипту передаётся id видео ролика. Например, страница с видео имеет адрес

http://www.youtube.com/watch?v=zrKO7ftQZm8

, а id данного видео будет

zrKO7ftQZm8

Используя этот id скрипт парсит (ранее «высасывает»http://www.zhitenev.ru/wp-includes/images/smilies/icon_mrgreen.gif) со страницы правильный, работающий ключ и возвращает его. Единственный минус моего скрипта в том, что он не возвращает адрес картинки-превьюшки, но это не критично, имхо. К тому-же, через 3 дня, когда сдам все зачёты, будет больше свободного времени и я доработаю свой скрипт. Тогда он не будет уступать своему со-брату, а именно: сделаю возможным выдачу адреса для картинки-превьюшки и возможность передачи ему, как id страницы, так и обычной ссылки на видео.

Вот сам скрипт.
Скрипт требует подключенную библиотеку curl.

<?php
header("Cache-Control: no-cache, must-revalidate");
header("Content-type: text/xml");
$cUrl = curl_init();
$ur=$_GET['id'];
$urlAddress = "http://www.youtube.com/watch?v=".$ur."";
if (($html = urlGetContents($cUrl, $urlAddress)) === false) {
    print "Адрес <b>".$urlAddress."</b> в данный момент недоступен";
} else {
    print $html;
}
curl_close($cUrl);
function urlGetContents(& $cUrl, $url, $port = 80, $timeout = 5, $errCount = 1)
{
    curl_setopt($cUrl, CURLOPT_URL, $url);
    curl_setopt($cUrl, CURLOPT_PORT, $port);
    curl_setopt($cUrl,CURLOPT_RETURNTRANSFER,1);
    curl_setopt($cUrl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)");
    curl_setopt($cUrl, CURLOPT_TIMEOUT, $timeout);
    $content = curl_exec($cUrl);
    if (curl_getinfo($cUrl,CURLINFO_HTTP_CODE) != 200) {
        return (($errCount < 2) ? urlGetContents($cUrl, $url, $port, $timeout, ++$errCount) : false);
    } else {
        //return $content;
if(eregi("\"t\": \"(.*)\"", $content, $out)) {
$t=substr($out[1],0,44);
$iurl="";
$ur=$_GET['id'];
return '<xml><video video_id="'.$ur.'" iurl="'.$iurl.'" t="'.$t.'" /></xml>';
} else {
return '<xml><message error="Bad URL." /></xml>';
}
    }
}
?>

Читать полностью