Есть такой отличный сервис placehold.it. Он позволяет легко генерировать изображения-заглушки для баннеров. Не так давно о нем писали на хабре, и с тех пор я им активно пользовался, пока он не начал периодически падать. Вечером на коленке был написан аналогичный сервис, может быть кому-нибудь пригодится.
Структура:
_ cache — каталог для сохранения изображений, нужны права на запись в этот каталог
_ fonts — шрифты
___ Verdana.ttf
_ index.php
_ page.tpl.php — шаблон страницы
_ .htaccess
.htaccess
Обрабатываем URL в index.php
Copy Source | Copy HTML
- Options -Indexes
- Options +FollowSymLinks
- DirectoryIndex index.php
- <IfModule mod_rewrite.c>
- RewriteEngine on
- RewriteCond %{REQUEST_FILENAME} !-f
- RewriteCond %{REQUEST_FILENAME} !-d
- RewriteCond %{REQUEST_URI} !=/favicon.ico
- RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
- </IfModule>
index.php
Логика проста: проверяем GET параметры, если их нет — отдаем страницу с информацией, если есть — проверяем параметры и отдаем баннер.
Copy Source | Copy HTML
- // Проверяем параметры
- if (empty($_GET)) {
- get_page();
- }
- elseif($_GET['q']) {
- $nocache = isset($_GET['nocache']) ? TRUE : FALSE;
-
- $arg = explode('/', $_GET['q']);
-
- // Размеры картинки
- $size = get_size($arg[ 0]);
- // Цвет
- $color = get_color($arg[1], 'CCCCCC');
- // Текст
- $text = isset($arg[2]) ? $arg[2] : $size->width.'x'.$size->height;
- // Цвет текста
- $textcolor = get_color($arg[3], '666666');
-
- $filename = get_image_path($size, $color, $text, $textcolor, $nocache);
-
- if ($nocache) {
- get_page(array('image' => $filename));
- }
-
- header("Content-Type: " . mime_content_type($filename));
- print file_get_contents($filename);
- }
Для себя оставил параметр nocache — если он задан, изображение пересохранится в любом случае, иначе возьмется из кэша.
Используемые функции
get_size()
Функция проверяет размер изображения и возвращает объект с размерами.
Copy Source | Copy HTML
- function get_size($size, $default = '200x200') {
- $clear = isset($size) && preg_match("/^[1-9][0-9]+x[1-9][0-9]+$/", $size) ? $size : $default;
- $size = explode('x', $clear);
- $return = new stdClass();
- $return->width = $size[ 0] < 5000 ? $size[ 0] : 5000;
- $return->height = $size[1] < 5000 ? $size[1] : 5000;
- return $return;
- }
get_color()
Функция проверяет цвет и возвращает объект с цветами.
Copy Source | Copy HTML
- function get_color($color, $default = 'CCCCCC') {
- $return = new stdClass();
- $rgb = isset($color) && preg_match("/^[0-9a-fA-F]{6}$/", $color) ? strtoupper($color) : strtoupper($default);
- $return->red = hexdec($rgb[ 0] . $rgb[1]);
- $return->green = hexdec($rgb[2] . $rgb[3]);
- $return->blue = hexdec($rgb[4] . $rgb[5]);
- $return->color = $rgb;
-
- return $return;
- }
get_page()
Функция рендерит страницу из шаблона
Copy Source | Copy HTML
- function get_page($variables = array()) {
- extract($variables, EXTR_SKIP);
- ob_start();
- include "./page.tpl.php";
- $contents = ob_get_contents();
- ob_end_clean();
- exit($contents);
- }
get_image_path()
Функция генерирует изображение и возвращает путь к нему. Если файл уже есть, он не пересоздается.
Copy Source | Copy HTML
- function get_image_path($size, $color, $text, $textcolor, $nocache = FALSE) {
- // Файл
- $dirname = 'cache/'.$color->color.'/'.$size->width.'/'.$size->height.'/'.$textcolor->color;
- $filename = $dirname.'/'.trim($text).'.png';
-
- if (!is_file($filename) || $nocache) {
-
- // Создаем директорию если необходимо
- if (!is_dir($dirname)) {
- mkdir($dirname, 0777, TRUE);
- }
-
- // Создаем изображение
- $image = imagecreatetruecolor($size->width, $size->height);
-
- // Цвет
- $rgb = imagecolorallocate($image, $color->red, $color->green, $color->blue);
-
- // Заливаем цветом
- imagefilledrectangle($image, 0, 0, $size->width, $size->height, $rgb);
-
- // Размер текста
- $textsize = 16;
- // Координаты текста
- $coordinates = imageftbbox(16, 0, 'fonts/Arial.ttf', $text);
- $x = ($size->width - $coordinates[2]) / 2;
- $y = ($size->height - $coordinates[5]) / 2;
-
- // Пишем текст
- $textrgb = imagecolorallocate($image, $textcolor->red, $textcolor->green, $textcolor->blue);
- imagefttext($image, $textsize, 0, $x, $y, $textrgb, 'fonts/Verdana.ttf', $text);
-
- // Сохраняем
- imagepng($image, $filename, 9);
- }
-
- return $filename;
- }
page.tpl.php
Copy Source | Copy HTML
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>BannerMaker Beta 1.0</title>
- </head>
-
- <body>
- <p>Use link: <strong>http://<?php print $_SERVER['HTTP_HOST']; ?>/WIDTHxHEIGHT/COLOR/TEXT/TEXTCOLOR</strong></p>
- <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>
- <?php if ($image): ?>
- <p><img src="/<?php print $image; ?>" alt="" /></p>
- <?php endif; ?>
- </body>
- </html>
-
Итог
Ссылка имеет вид example.com/WIDTHxHEIGHT/COLOR/TEXT/TEXTCOLOR, что удобно и просто (COLOR/TEXT/TEXTCOLOR можно опустить).
Конечно, при живом использовании стоит добавить проверки типа «смогли ли создать директорию/файл», убрать «nocache».
Буду рад, если кому-нибудь пригодится такой сервис.