Работа с phpThumb

Не многие задумывались, что вместе с MODX Revolution поставляется и phpThumb. Это, фактически, единственная и самая крутая библиотека для работы с изображениями на PHP.
В MODX принято работать с ней через сниппет phpThumbOf, однако у него есть существенные недостатки, например серьёзные тормоза и странное кэширование. Поэтому, верным способом будет работа с библиотекой напрямую.
При разработке "Файлохранилища" мне пришлось покопаться в том, как устроен phpThumb и как он интегрирован в MODX, в результате чего появился универсальный рецепт использования этой библиотеки для генерации изображений.
Заодно решил известную проблему с генерацией уменьшенной копии, с обрезкой из левой верхней части картинки.
Запуск phpThumb
Предлагаю универсальный скрипт, который может запускаться как снаружи MODX, так и в качестве сниппета.
<?php
if (!isset($modx)) {
define('MODX_API_MODE', true);
require 'index.php'; // Если запускаем снаружи - тут надо указать путь к файлу в корне сайта
$modx->getService('error','error.modError');
$modx->setLogLevel(modX::LOG_LEVEL_ERROR);
$modx->setLogTarget('FILE');
}
$src = MODX_BASE_PATH.'img.jpg'; // Исходник
$dst = MODX_BASE_PATH.'img_thumb.jpg'; // Уменьшенная копия
$params = array(
'w' => 300 , // Ширина
'h' => 176, // Высота
'bg' => 'ffffff', // Фон
'q' => 95, // Качество в %
'zc' => 'TL', // Обрезка, TL - это Top Left, есть еще C - center, BR - Bootom Right и т.д.
'f' => 'jpg', // Формат изображения
);
// Подключаем обёртку MODX, которая выставит системные настройки в класс phpThumb
$phpThumb = $modx->getService('modphpthumb','modPhpThumb', MODX_CORE_PATH . 'model/phpthumb/', array());
// Указываем исходник
$phpThumb->setSourceFilename($src);
// Выставляем параметры
foreach ($params as $k => $v) {
$phpThumb->setParameter($k, $v);
}
// Генерируем уменьшенную копию
if ($phpThumb->GenerateThumbnail()) {
// Выводим готовое изображение сразу на экран
//return $phpThumb->OutputThumbnail();
// Или сохраняем в файл
if (!$phpThumb->renderToFile($dst)) {
$modx->log(modX::LOG_LEVEL_ERROR, 'Could not save rendered image to'.$dst);
}
}
else {
// Если возникла ошибка - пишем лог работы в журнал MODX
$modx->log(modX::LOG_LEVEL_ERROR, print_r($phpThumb->debugmessages, 1));
}Этот скрипт прекрасно работает, обрезает и уменьшает изображения за исключением одного момента — обрезка идёт всегда по центру рисунка. Причем, зависит это не от phpThumb, а от сервера.ImageMagick
phpThumb сам не умеет конвертировать изображения, он запускает один из модулей PHP: phpGD2 или ImageMagick.
Первый есть на всех хостингах и ничего не требует, но обладает меньшими возможностями. Второй же, как правило, нужно ставить самостоятельно, да еще и создавать ему условия, ибо он запускается через консоль.
Та самая обрезка с левого верхнего угла, которую я хотел сделать, работает только с ImageMagick. Также, только с ним поддерживается прозрачный фон png. Да и вообще, он вроде качественнее конвертирует.
Устанавливаем его на сервер, настроенный по этой заметке:
sudo apt-get install imagemagick php5-imagickПерезапускаем php5-fpm:sudo service php5-fpm restartСмотрим в phpinfo(), что ImageMagick подключен.Проверяем работу скрипта и ничего не меняется!
А дело в том, что на моём сервере (и многих других) отключены функции exec, system, shell_exec и passthru, через которые phpThumb пытается выяснить версию установленного ImageMagick, а потом и запустить его на конвертацию.
Понять это можно, если поглядеть в лог работы:
[2013-01-27 10:50:30] (ERROR @ /test.php) Array
(
[0] => phpThumb() v1.7.9-200712090829 in file "phpthumb.class.php" on line 216
[1] => setSourceFilename(/var/www/static/www/img.jpg) set $this->sourceFilename to "/var/www/mysite/www/img.jpg" in file "phpthumb.class.php" on line 243
[2] => file_exists() = 0 in file "phpthumb.class.php" on line 1101
[3] => is_executable() = 0 in file "phpthumb.class.php" on line 1102
[4] => ImageMagickThumbnailToGD() aborting because cannot find convert in $this->config_imagemagick_path (), and `which convert` returned () in file "phpthumb.class.php" on line 1131
[5] => $AvailableImageOutputFormats = array(text;ico;bmp;wbmp;gif;png;jpeg) in file "phpthumb.class.php" on line 884ImageMagickThumbnailToGD() aborting выглядит нехорошо, правда?Поэтому, как бы не хотелось, но нужно включить одну из этих опасных функций, чтобы ImageMagick начал работать. Хорошо, что хоть open_basedir отключать не требуется.
Результат работы phpThumb с параметром zc = TL:
Не забывайте, что всегда можно проверить, какой способ используется в логе $phpThumb->debugmessages.
Комментарии: 17
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
2. ThumbOf иThumb чем существенно различаются, что-то не нашёл в Рунете?
phpThumb — библиотека для работы с изображениями.
phpThumbOf — сниппет MODX для ресайза и кэша изображений с помощью phpThumb.
Файл создается, но пустой.
100% с правами что-то.
Придется хостинг менять.
Если что, хостинги тут.
Есть еще Active.by — вообще отдельная история, там стоит хоститься только если ты любишь латексные костюмы, боль и удары плетки — отличным дополнением станет) Кстати, там в антихостинг его можно смело добавлять — медленный, с отвратительной панелью, корявой поддержкой и страшными глюками с половиной компонентов и особенно с картинками.
+ у Active отличная техподдержка, чего я, при всем желании и уважении, не могу сказать о саппорте тутбаевского hoster.by. Хотя у hoster.by — вполне вменяемый и нормальный рабочий виртуальный хостинг. В общем, это вопрос личного выбора. Но active.by я бы точно не заносил в черный список.
Жуткую панель управления обновили. Так что буду продлевать еще на год и купил подписку на activecloud.ru (то же самое, только в РФ), чтобы перенести российские сайты. Дополнительный плюс — партнерка, для РФ можно 50% стоимости компенсировать. SSH опять же бесплатный.
Ну это я так, к слову.
На хостинге Таймвеб судя по php info:
imagick module enabled
imagick module version 3.0.1
imagick classes Imagick, ImagickDraw, ImagickPixel, ImagickPixelIterator
ImageMagick version ImageMagick 6.6.1-2 2010-07-06 Q16 www.imagemagick.org
Т.е. должно все работать без проблем? Не сталкивался с работой ImageMagick именно на Timeweb?
Спасибо.
PS Вот то же решение предлагается www.darkstardesign.com/resources/phpthumbsup и то же для ресайза ImageMagick используется.
Если там есть ImageMagick, и доступ к нему из консоли — всё должно работать нормально.
На хостинге можно штатными средствами подключить imagic (отметить чекбокс :) ).
Что и как нужно изменить в настройках, чтобы генерились PNG с прозрачным фоном? Исходные изображения, разумеется, тоже с прозрачным фоном загружаю.
Спасибо!
Здесь мы вне зависимости от того, получилось ли определить версию imageMagick или нет, выводим фейковое значение.