22 September 2010

Генерирование баннеров-заглушек

PHP

Есть такой отличный сервис placehold.it. Он позволяет легко генерировать изображения-заглушки для баннеров. Не так давно о нем писали на хабре, и с тех пор я им активно пользовался, пока он не начал периодически падать. Вечером на коленке был написан аналогичный сервис, может быть кому-нибудь пригодится.


Структура:


_ cache — каталог для сохранения изображений, нужны права на запись в этот каталог
_ fonts — шрифты
___ Verdana.ttf
_ index.php
_ page.tpl.php — шаблон страницы
_ .htaccess

.htaccess


Обрабатываем URL в index.php
Copy Source | Copy HTML
  1. Options -Indexes
  2. Options +FollowSymLinks
  3. DirectoryIndex index.php
  4. <IfModule mod_rewrite.c>
  5. RewriteEngine on
  6. RewriteCond %{REQUEST_FILENAME} !-f
  7. RewriteCond %{REQUEST_FILENAME} !-d
  8. RewriteCond %{REQUEST_URI} !=/favicon.ico
  9. RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
  10. </IfModule>


index.php


Логика проста: проверяем GET параметры, если их нет — отдаем страницу с информацией, если есть — проверяем параметры и отдаем баннер.
Copy Source | Copy HTML
  1. // Проверяем параметры
  2. if (empty($_GET)) {
  3. get_page();
  4. }
  5. elseif($_GET['q']) {
  6. $nocache = isset($_GET['nocache']) ? TRUE : FALSE;
  7. $arg = explode('/', $_GET['q']);
  8. // Размеры картинки
  9. $size = get_size($arg[ 0]);
  10. // Цвет
  11. $color = get_color($arg[1], 'CCCCCC');
  12. // Текст
  13. $text = isset($arg[2]) ? $arg[2] : $size->width.'x'.$size->height;
  14. // Цвет текста
  15. $textcolor = get_color($arg[3], '666666');
  16. $filename = get_image_path($size, $color, $text, $textcolor, $nocache);
  17. if ($nocache) {
  18. get_page(array('image' => $filename));
  19. }
  20. header("Content-Type: " . mime_content_type($filename));
  21. print file_get_contents($filename);
  22. }

Для себя оставил параметр nocache — если он задан, изображение пересохранится в любом случае, иначе возьмется из кэша.

Используемые функции


get_size()

Функция проверяет размер изображения и возвращает объект с размерами.
Copy Source | Copy HTML
  1. function get_size($size, $default = '200x200') {
  2. $clear = isset($size) && preg_match("/^[1-9][0-9]+x[1-9][0-9]+$/", $size) ? $size : $default;
  3. $size = explode('x', $clear);
  4. $return = new stdClass();
  5. $return->width = $size[ 0] < 5000 ? $size[ 0] : 5000;
  6. $return->height = $size[1] < 5000 ? $size[1] : 5000;
  7. return $return;
  8. }


get_color()

Функция проверяет цвет и возвращает объект с цветами.
Copy Source | Copy HTML
  1. function get_color($color, $default = 'CCCCCC') {
  2. $return = new stdClass();
  3. $rgb = isset($color) && preg_match("/^[0-9a-fA-F]{6}$/", $color) ? strtoupper($color) : strtoupper($default);
  4. $return->red = hexdec($rgb[ 0] . $rgb[1]);
  5. $return->green = hexdec($rgb[2] . $rgb[3]);
  6. $return->blue = hexdec($rgb[4] . $rgb[5]);
  7. $return->color = $rgb;
  8. return $return;
  9. }


get_page()

Функция рендерит страницу из шаблона
Copy Source | Copy HTML
  1. function get_page($variables = array()) {
  2. extract($variables, EXTR_SKIP);
  3. ob_start();
  4. include "./page.tpl.php";
  5. $contents = ob_get_contents();
  6. ob_end_clean();
  7. exit($contents);
  8. }


get_image_path()

Функция генерирует изображение и возвращает путь к нему. Если файл уже есть, он не пересоздается.
Copy Source | Copy HTML
  1. function get_image_path($size, $color, $text, $textcolor, $nocache = FALSE) {
  2. // Файл
  3. $dirname = 'cache/'.$color->color.'/'.$size->width.'/'.$size->height.'/'.$textcolor->color;
  4. $filename = $dirname.'/'.trim($text).'.png';
  5. if (!is_file($filename) || $nocache) {
  6. // Создаем директорию если необходимо
  7. if (!is_dir($dirname)) {
  8. mkdir($dirname, 0777, TRUE);
  9. }
  10. // Создаем изображение
  11. $image = imagecreatetruecolor($size->width, $size->height);
  12. // Цвет
  13. $rgb = imagecolorallocate($image, $color->red, $color->green, $color->blue);
  14. // Заливаем цветом
  15. imagefilledrectangle($image, 0, 0, $size->width, $size->height, $rgb);
  16. // Размер текста
  17. $textsize = 16;
  18. // Координаты текста
  19. $coordinates = imageftbbox(16, 0, 'fonts/Arial.ttf', $text);
  20. $x = ($size->width - $coordinates[2]) / 2;
  21. $y = ($size->height - $coordinates[5]) / 2;
  22. // Пишем текст
  23. $textrgb = imagecolorallocate($image, $textcolor->red, $textcolor->green, $textcolor->blue);
  24. imagefttext($image, $textsize, 0, $x, $y, $textrgb, 'fonts/Verdana.ttf', $text);
  25. // Сохраняем
  26. imagepng($image, $filename, 9);
  27. }
  28. return $filename;
  29. }


page.tpl.php


Copy Source | Copy HTML
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>BannerMaker Beta 1.0</title>
  6. </head>
  7. <body>
  8. <p>Use link: <strong>http://<?php print $_SERVER['HTTP_HOST']; ?>/WIDTHxHEIGHT/COLOR/TEXT/TEXTCOLOR</strong></p>
  9. <p>Example: <a href="http://<?php print $_SERVER['HTTP_HOST']; ?>/468x60/CCFFAA/Hello world!/000000">http://<?php print $_SERVER['HTTP_HOST']; ?>/468x60/CCFFAA/Hello world!/000000</a></p>
  10. <?php if ($image): ?>
  11. <p><img src="/<?php print $image; ?>" alt="" /></p>
  12. <?php endif; ?>
  13. </body>
  14. </html>


Итог


Ссылка имеет вид example.com/WIDTHxHEIGHT/COLOR/TEXT/TEXTCOLOR, что удобно и просто (COLOR/TEXT/TEXTCOLOR можно опустить).

Конечно, при живом использовании стоит добавить проверки типа «смогли ли создать директорию/файл», убрать «nocache».

Буду рад, если кому-нибудь пригодится такой сервис.
Tags:полезностиhtml-версткаimagesplaceholder
Hubs: PHP
+5
4.2k 32
Comments 12