PHP → Создаём аналог ImageCache для использования вне друпала

18.09.2010

В друпале есть удобный модуль ImageCache, который производит манипуляции над изображениями по заранее созданному набору правил (пресету). Благодаря ему, больше не нужно обрабатывать каждое изображение после загрузки его на сервер (они все хранятся в оригинальном виде), достаточно лишь при генерации страницы указать путь к картинке в виде:

/imagecache/preset-name/path/to/image.jpg

При первом запросе такой картинки, скрипт на основе файла path/to/image.jpg и набора правил preset-name создаст новое изображение и положит его в кэш. При последующих запросах, картинка будет отдаваться из кэша, минуя запуск скрипта и поднятия php.

Создать такой скрипт самостоятельно достаточно легко:

1. Создаём в корне сайта папку imagecache и даём ей права на запись.

2. Помещаем в неё файл .htaccess со следующим содержанием:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/(.+\.(jpe?g|gif|png))$ ../imagecache.php?preset=$1&file=$2 [NC]

После этого, все запросы на отсутствующие файлы в папке imagecache, будут проходить через скрипт imagecache.php.

В скрипте будут доступны две переменные: $_GET['preset'] — название пресета, $_GET['file'] — путь до файла который нужно обработать.

3. Создаём в корне сайта файл imagecache.php с кодом:

<?php
define('ROOT_DIR', dirname(__FILE__) . '/');
require_once(ROOT_DIR . 'includes/class.upload/class.upload.php');

$image = new upload(ROOT_DIR . $_GET['file']);

// пример пресета news-thumbs, который создаёт эскиз изображения размером 50x50
if ($_GET['preset'] == 'news-thumb')
{
    $image->image_y = 50;
    $image->image_x = 50;
    $image->image_ratio_crop = true;
}
// пример пресета news, который создаёт изображения размером 250x250
else if ($_GET['preset'] == 'news')
{
    $image->image_y = 250;
    $image->image_x = 250;
    $image->image_ratio = true;
    $image->image_ratio_no_zoom_in = true;
}
// ... другие пресеты ...
else
{
    die('error: no preset');
}

$filedir = dirname($_GET['file']);

$image->image_resize = true;
$image->auto_create_dir = true;
$image->file_safe_name = false;
$image->file_overwrite = true;
$image->process(ROOT_DIR . 'imagecache/' . $_GET['preset'] . '/' . ($filedir == '.' ? '' : $filedir));

if (!$image->processed)
{
    die('error: ' . $image->error);
}

header('Location: ' . $_SERVER['REQUEST_URI']);
?>

Скрипт использует библиотеку class.upload.php для работы с изображениями.

4. Теперь если в html коде написать:

<img src="/imagecache/news-thumb/upload/123.jpg" alt="" />

то посетитель увидит картинку upload/123.jpg размером 50x50 пикселей.

Код нуждается в небольшой доработке — например нужно будет запретить вызывать скрипт напрямую из браузера, запретить обрабатывать изображения находящиеся в кэше, а так же выдавать правильные заголовки при ошибках, но основная идея думаю понятна.

Похожие записи

Комментарии

Суперски! То, что искал и не знал, как сделать.

Все гениальное просто! Огромное спасибо за скрипт!

Хороший у вас блог! Всегда нахожу нужное!!!

Игорь
26.03.2014, 11:30

Вот облом -

string; $image_rotate

Rotates the image by increments of 45 degrees

Value is either 90, 180 or 270

Default value is null (no rotation)

access: public

А мне надо по 10 градусов поворачивать. модуль в друпале с этим справляется. Придется брать напильник...)))
Может есть какие то мысли по этому поводу?

Игорь
27.03.2014, 14:27

в imagecache_actions человеко понятные пресеты
А здесь, то ли нет этого, то ли я не понимаю как сделать...
Например: Как под изображение подложить холст заданного размера и фона?

Игорь
28.03.2014, 22:08

"Офигительный класс" подложить холст и rotate по 10 градусов - пришлось дописать условие
$image->image_rotate_background = array(int); // сделал массивом, может ещё что понадобится...)))
ватермарка легла хорошо, а вот текст кирилица - совсем не хочет проявляться, только крякозябры.
Пришлось изучить какие нужны шрифты и как их конвертировать: есть прога для win (ttf2gdf_PHP_FONTS) и php класс: Конвертер GDF шрифтов
Но всё равно не работают эти шрифты...)))
посмотрел код, текст выводит imagestring
а друпал модуле imagecache_actions (image_effects_text) выводит через ttf шрифт - imagettftext
xandeadx скажите, как вы водите кириллицу на фото и выводили ли этим классом?

кириллицу на фото не выводил
и хватит офтопить. для вопросов по php есть прекрасные сервисы вроде stackoverflow или toster ;)

Добавить комментарий