Что если загруженную на сервер фотографию необходимо чуть-чуть подправить, а фотошоп или какой-нибудь другой графический редактор не установлен? Оказывается
PHP с библиотекой
GD способны помочь нам в этом вопросе. Итак к делу:
1) Скачиваем
архив, рассматриваем структуру файлов.
- im.html(view) - здесь выводятся изображения, панель управления, подключается prototype.js(используем Ajax).
- im.php(controller) - принимаем $_POST данные, подключаем class.imageManipulation.php
- class.imageManipulation.php(model) - обрабатываем изображение в зависимости от входящих данных.
2)Разбираем детально
view структуру: ближе к началу файла находятся JS функции, для наглядности они разделены на
imageManipulation(),
imageContrast(),
imageColorize().
function imageManipulation(filename, effect){
var url = 'im.php';
var pars = 'effect='+effect+'&filename='+filename;
var el = 'new_img';
var myAjax = new Ajax.Updater(el, url, {method: 'post', parameters: pars});
}
Расковыряем самую простую из них
imageManipulation(), аргументы: путь к файлу, название эффекта. Эта информация передается в ...
3) ...
controller:
include_once( 'class.imageManipulation.php' );
$img_path = $_SERVER['DOCUMENT_ROOT'].'/pics/' . $_POST['filename'];
$m_img = new imageManipulationClass( $img_path );
$orig_path = str_replace( '_ex', '_s', $img_path );
switch( $_POST['effect'] ){
case 'gray':
$m_img->imageFilterGray();
break;
....
default:
echo ( 'No filter' );
}
$m_img->imageSave( $img_path );
Подключаем class.imageManipulation.php, определяемся с путями, создаём экземпляр класса $m_img, узнаем путь к изображению оригиналу, запускаем switch и в зависимости от желаемого эффекта заставляем срабатывать метод класса, сохраняем imageSave и выводим изображение.
4)
model:
function imageFilterGray(){
imagefilter( $this->img_source, IMG_FILTER_GRAYSCALE );
return $this->img_source;
}
Сдесь происходит куча вспомогательной работы, но самое главное очень просто - например imageFilterGray() думаю и так все понятно
Думаю все можно было бы сделать более универсально, но я намеренно постарался пойти по пути максимально понятной структуры кода. Если есть вопросы - задавайте
P.S. Кстати, эффекты накладываются друг на друга и благодаря этому можно добиться удивительных результатов. В крайнем случае всегда можно нажать на кнопочку Clear
2 комментария
Только нужно не забыть сделать функцию отката на всякий случай. А то, вдруг, пользователю не понравится манипуляция
Да, там есть в самом низу Clear