В друпале есть удобный модуль 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 пикселей.
Код нуждается в небольшой доработке — например нужно будет запретить вызывать скрипт напрямую из браузера, запретить обрабатывать изображения находящиеся в кэше, а так же выдавать правильные заголовки при ошибках, но основная идея думаю понятна.
Комментарии
Суперски! То, что искал и не знал, как сделать.
Все гениальное просто! Огромное спасибо за скрипт!
Хороший у вас блог! Всегда нахожу нужное!!!
Вот облом -
А мне надо по 10 градусов поворачивать. модуль в друпале с этим справляется. Придется брать напильник...)))
Может есть какие то мысли по этому поводу?
Придется использовать drupal function image_gd_rotate
в imagecache_actions человеко понятные пресеты
А здесь, то ли нет этого, то ли я не понимаю как сделать...
Например: Как под изображение подложить холст заданного размера и фона?
"Офигительный класс" подложить холст и 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 ;)
Добавить комментарий