Pull to refresh

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

Reading time6 min
Views5.6K

Есть такой отличный сервис 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».

Буду рад, если кому-нибудь пригодится такой сервис.
Tags:
Hubs:
+5
Comments12

Articles