заказчик: Пусть аватарки пользователей у нас будут в 50×50 и 100×100, в JPEG
разработчик: Готово
заказчик: Надо переделать, чтобы аватарки были в PNG
разработчик: Сделал
заказчик: Пусть аватарки будут в GIF, 25×25 и 40×40
разработчик: Ага, проверяй
заказчик: Уже? Как ты это так быстро делаешь???
разработчик: …
Это всё, что от нас потребовалось сделать, дальше дело за Primage, который кстати говоря включает в себя ещё несколько полезных функций в плане организации хранения и обработки изображений.
Скачать последнюю версию Primage, подписаться на обновления по RSS или поучаствовать в разработке можно на странице проекта.
Поздравляю всех с Праздником Дня Программиста!!!
Успехов нам всем! :)
разработчик: Готово
заказчик: Надо переделать, чтобы аватарки были в PNG
разработчик: Сделал
заказчик: Пусть аватарки будут в GIF, 25×25 и 40×40
разработчик: Ага, проверяй
заказчик: Уже? Как ты это так быстро делаешь???
разработчик: …
Как-то так
- Все загружаемые изображения хранятся в оригинальном формате, что позволяет трансформировать их с минимальной потерей качества.
- В DOCUMENT ROOT создаётся пустая папка, в которую помещается .htaccess, который в случае обращения к несуществующему файлу передаёт выполнение proxy.php.
- proxy.php в зависимости от соответствия URL запроса некому шаблону, к примеру /img/avatars/{id}_big.jpg берёт изображение с идентификатором {id}, выполняет над ним ряд трансформаций, сохраняет в файл по адресу соответствующему запросу и перенаправляет клиента на тот же URL.
- При повторном запросе с тем же URL proxy.php уже не вызывается т.к. необходимый файл с изображением уже существует.
А точнее
На базе этой самой Primage реализуем нашу версию proxy.php:
- // хранилище оригинальных изображений
- $avatarsStorage = new Primage_Proxy_Storage('data/avatars', 'jpg', 90);
- // хранилище трансформированных изображений
- $avatarsProxyStorage = new Primage_Proxy_Storage('public_html/img/avatars', 'jpg', 80);
-
- // роутер ассоциирующий шаблоны URL с контроллерами
- $router = new Primage_Proxy_Router(false);
-
- // контроллер для трансформации больших аватарок
- $avatarsBig = new Primage_Proxy_Controller_CopyById($avatarsStorage, $avatarsProxyStorage);
- $avatarsBig->addAction(new Primage_Proxy_Action_Resize(200, 300));
- $router->addController('avatars/{id}_big.jpg', $avatarsBig);
-
- // контроллер для трансформации маленьких аватарок
- $avatarsSmall = new Primage_Proxy_Controller_CopyById($avatarsStorage, $avatarsProxyStorage);
- $avatarsSmall->addAction(new Primage_Proxy_Action_Resize(50, 50));
- $router->addController('avatars/{id}_small.jpg', $avatarsSmall);
-
- // контроллер для трансформации аватарок с динамическим разрешением (будьте острожнее с контроллерами этого класса т.к. злоумышленник может запустить избыточную генерацию изображений)
- $step = 50;
- $maxWidth = 1000;
- $maxHeight = 1000;
- $avatarsDynamic = new Primage_Proxy_Controller_CopyWithResize($avatarsStorage, $avatarsProxyStorage, $maxWidth, $maxHeight, $step);
- $router->addController('avatars/{id}_{width}x{height}.jpg', $avatarsDynamic);
-
- // обработка запроса соответствующим контроллером
- $controller = $router->getController($_SERVER['REQUEST_URI'], &$params);
- if($controller) {
- try {
- $controller->dispatch($params);
- header('Location: ' . $_SERVER['REQUEST_URI']);
- exit;
- }
- catch(Primage_Proxy_Storage_SourceNotFound $e) {
- }
- catch(Primage_Proxy_Controller_RequestException $e) {
- }
- }
- header('HTTP/1.0 404 Not Found');
Это всё, что от нас потребовалось сделать, дальше дело за Primage, который кстати говоря включает в себя ещё несколько полезных функций в плане организации хранения и обработки изображений.
Скачать последнюю версию Primage, подписаться на обновления по RSS или поучаствовать в разработке можно на странице проекта.
Поздравляю всех с Праздником Дня Программиста!!!
Успехов нам всем! :)