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


    Есть такой отличный сервис 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.  
    8.     $arg = explode('/', $_GET['q']);
    9.  
    10.     // Размеры картинки
    11.     $size = get_size($arg[ 0]);
    12.     // Цвет
    13.     $color = get_color($arg[1], 'CCCCCC');
    14.     // Текст
    15.     $text = isset($arg[2]) ? $arg[2] : $size->width.'x'.$size->height;
    16.     // Цвет текста
    17.     $textcolor = get_color($arg[3], '666666');
    18.  
    19.     $filename = get_image_path($size, $color, $text, $textcolor, $nocache);
    20.  
    21.     if ($nocache) {
    22.         get_page(array('image' => $filename));
    23.     }
    24.  
    25.     header("Content-Type: " . mime_content_type($filename));
    26.     print file_get_contents($filename);
    27. }

    Для себя оставил параметр 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.  
    9.     return $return;
    10. }


    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.  
    6.     if (!is_file($filename) || $nocache) {
    7.  
    8.         // Создаем директорию если необходимо
    9.         if (!is_dir($dirname)) {
    10.             mkdir($dirname, 0777, TRUE);
    11.         }
    12.  
    13.         // Создаем изображение
    14.         $image = imagecreatetruecolor($size->width, $size->height);
    15.  
    16.         // Цвет
    17.         $rgb = imagecolorallocate($image, $color->red, $color->green, $color->blue);
    18.  
    19.         // Заливаем цветом
    20.         imagefilledrectangle($image,  0,  0, $size->width, $size->height, $rgb);
    21.  
    22.         // Размер текста
    23.         $textsize = 16;
    24.         // Координаты текста
    25.         $coordinates = imageftbbox(16,  0, 'fonts/Arial.ttf', $text);
    26.         $x = ($size->width - $coordinates[2]) / 2;
    27.         $y = ($size->height - $coordinates[5]) / 2;
    28.  
    29.         // Пишем текст
    30.         $textrgb = imagecolorallocate($image, $textcolor->red, $textcolor->green, $textcolor->blue);
    31.         imagefttext($image, $textsize,  0, $x, $y, $textrgb, 'fonts/Verdana.ttf', $text);
    32.  
    33.         // Сохраняем
    34.         imagepng($image, $filename, 9);
    35.     }
    36.  
    37.     return $filename;
    38. }


    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.  
    8.     <body>
    9.         <p>Use link: <strong>http://<?php print $_SERVER['HTTP_HOST']; ?>/WIDTHxHEIGHT/COLOR/TEXT/TEXTCOLOR</strong></p>
    10.         <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>
    11.         <?php if ($image): ?>
    12.             <p><img src="/<?php print $image; ?>" alt="" /></p>
    13.         <?php endif; ?>
    14.     </body>
    15. </html>
    16.  


    Итог


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

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

    Буду рад, если кому-нибудь пригодится такой сервис.
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 12

      0
      Исходники есть и на dummyimage.com/
        –1
        Ну свои то с блекджеком )
          0
          Мне кажется, что блекджек автора dummyimage сильнее вашего:)
          В том смысле, что сервис его куда юзабельнее.
            0
            Кроме того, что можно выбрать формат изображения не вижу ничего «более юзабельного»
              0
              Ну да, а то что можно ручками нормально прописать в полях формат сообщения, видеть в живую что получается. То что в зависимости от текста — его размер уменьшается (чтобы уменьшалось все в генерируемом изображение). То что они подумали о флеше и Silverlight и добавили crossdomain.xml…
              Да в общем хватит о мелочах. Действительно ваше более юзабельно ;)
                0
                Я не говорю, что мой вариант более юзабелен. Но он ведь и более прост ;) Мне не нужны все эти плюшки и хватает возможности генерации картинок.
        0
        ваши загулшки режет adblock. что-то ему не нравится :)
          +2
          Возможно title BannerMaker
          0
          Непонятно, как будете бороться с переполнением вашего кэша. Возможных вариантов ведь очень много…
            0
            Ну я же не предлагаю сервис «как есть», я предлагаю лишь его вариант.
            С переполнением кэша можно бороться как угодно, например убивать его по крону.
            0
            А какое преимущество даёт изображение против простого (x)html'я, который меньше весит, отображается всегда и меньше тратит ресурсов на генерацию?
              0
              При использовании систем показа баннеров (типа openX) на сайте забиваются регионы (зоны под баннеры), а управление баннерами происходит из другой среды. Там намного удобнее указать линк на картинку, чем париться с html.

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

            Самое читаемое