Для начала необходимо скачать расширение.

Это можно сделать с официального сайта Yii, раздел расширения:
http://www.yiiframework.com/extension/cimagemodifier/

Или по прямой ссылки с сайта кодер.укр:

Скачать


Распаковываем архив в папку с проектом /protected/extensions/imagemodifier. И начинаем работать с ним ;)


Простой пример работы с изображениями с помощью расширения CImageModifier для Yii Framework

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

<?php

//...код...

Yii::app()->setComponents(
    array('imagemod' => array(
        'class' => 'application.extensions.imagemodifier.CImageModifier')
    )
);

Yii::app()->imagemod->setLanguage('ru_RU');

$imageModifier = Yii::app()->imagemod->load($_FILES['formFieldName']);
if ($imageModifier->uploaded) {
    $imageModifier->image_resize = true;
    $imageModifier->image_ratio_y = true;
    $imageModifier->image_x = 50;
    $imageModifier->file_new_name_body = md5($img->file_src_name);
    $imageModifier->process(Yii::getPathOfAlias('webroot') . '/images/');
    if ($imageModifier->processed) {
        Yii::app()->user->setFlash('success', 'Изображение загружено успешно');
        $imageModifier->clean();
    } else {
        Yii::app()->user->setFlash('error', $imageModifier ->error);
    }
}

//...код...

Если Вам необходимо изменить уже загруженное изображение, то в параметре Yii::app()->imagemod->load (строка: 13) укажите путь к этому изображению, пример:


//...

Yii::app()->imagemod->setLanguage('ru_RU');

$img = Yii::app()->imagemod->load('путь/к/изображению');
if ($imageModifier->uploaded) {
    //...


Основные свойства расширения CImageModifier для Yii Framework


Обработка файла

Свойство Тип Описание
file_new_name_body string Заменяет имя файла.
Пример:
$handle->file_new_name_body = 'new_file_name';
file_name_body_add string Добавочная строка к имени файла (добавляется к концу имени).
Пример:
$handle->file_name_body_add = '_uploaded';
file_name_body_pre string Префикс к названию
Пример:
$handle->file_name_body_pre = 'thumb_';
file_safe_name boolean Форматирует имя (заменяет 'space', '-' и т.п. на '_') (по умолчанию: true)
Пример:
$handle->file_safe_name = true;
file_auto_rename boolean Автоматически переименовывает файл, если он уже существует (по умолчанию: true)
Пример:
$handle->file_auto_rename = true;

Обработка изображения

Свойство Тип Описание
image_convert |'png'|'jpeg'|'gif'|'bmp Если установлено, изображение будет преобразовано
Пример:
$handle->image_convert = 'jpg';
png_compression integer Устанавливает уровень сжатия для изображений в формате PNG, где 1 (быстрых, большие файлы) и 9 (медленных, маленькие файлы) (по умолчанию: null)
Пример:
$handle->png_compression = 9;
jpeg_quality integer Устанавливает качество сжатия для изображений в формате JPEG (по умолчанию: 85)
Пример: $handle->jpeg_quality = 50;

Изменение размеров изображений

Свойство Тип Описание
image_resize boolean Разрешает изменять размеры изображения (по умолчанию: false)
Пример:
$handle->image_resize = true;
image_x integer Ширина изображения в пикселях (по умолчанию: 150)
Пример:
$handle->image_x = 100;
image_y integer Высота изображения в пикселях (по умолчанию: 150)
Пример:
$handle->image_y = 200;
image_ratio boolean true - сохраняет размер исходного соотношения сторон (по умолчанию: false)
Пример:
$handle->image_ratio = true;
image_ratio_crop boolean true - сохранить соотношение оригинальных размеров при подрезке (по умолчанию: false)
Пример:
$handle->image_ratio_crop = true;
image_ratio_x boolean true - сохраняет соотношение сторон изображения по ширине (по умолчанию: false)
Пример:
$handle->image_ratio_x = true;
image_ratio_y boolean true - сохраняет соотношение сторон изображения по высоте (по умолчанию: false)
Пример:
$handle->image_ratio_y = true;

Текст изображения

Свойство Тип Описание
image_text string Текст на изображении (по умолчанию: null)
Пример:
$handle->image_text = 'тест';
image_text_direction 'v'|'h' Направление текста, 'h' по горизонтали, 'v' по вертикали (по умолчанию: 'h')
Пример:
$handle->image_text_direction = 'v';
image_text_color string Цвет текста (по умолчанию: #FFFFFF)
Пример:
$handle->image_text_color = '#000000';
image_text_opacity integer Прозрачность текста, число от 0 до 100, где 100 - без прозрачности (по умолчанию 100)
Пример:
$handle->image_text_opacity = 50;
image_text_font integer Встроенный шрифт для текста, от 1 до 5. 1 является наименьшим (по умолчанию: 5)
Пример:
$handle->image_text_font = 4;
image_text_x integer Абсолютное положение текста, в пикселях от левого края. Может быть отрицательным (по умолчанию: null)
Пример:
$handle->image_text_x = 5;
image_text_y integer Абсолютное положение текста, в пикселях от верхней границы. Может быть отрицательным (по умолчанию: null)
Пример:
$handle->image_text_y = 5;
image_text_position string Положение текста на изображении, сочетание одной или двух букв из "TBLR", где T - сверху, B - снизу, L - слева, R - справа (по умолчанию: null)
Пример:
$handle->image_text_position = 'LR';

Водяной знак изображения

Свойство Тип Описание
image_watermark string Добавляет водяной знак на изображения, значением является путь к изображению водяного знака. Принимаемые файлы gif, jpg, bmp, png (по умолчанию: null)
Пример:
$handle->image_watermark = '/путь/watermark.png';
image_watermark_x integer Абсолютное положение водяного знака, в пикселях от левого края. Может быть отрицательным (по умолчанию: null)
Пример:
$handle->image_watermark_x = 5;
image_watermark_y integer Абсолютное положение водяного знака, в пикселях от верхней границы. Может быть отрицательным (по умолчанию: null)
Пример:
$handle->image_watermark_y = 5;
image_watermark_position string Позиция водяного знака на изображении, сочетание одной или двух букв из "TBLR", где T- сверху, B - снизу, L - слева, T - справа (по умолчанию: null)
Пример:
$handle->image_watermark_position = 'LR';

Официальная документация: https://github.com/verot/class.upload.php/blob/master/README.md


Подробный пример работы с изображениями с помощью расширения CImageModifier для Yii Framework

Перейдем к подробному примеру использования расширения CImageModifier для загрузки изображения на сайт. Разберем загрузку изображений на сайт на примере добавления/редактирования статей. Создадим простую таблицу для статей и стандартную модель к ним (путь к модели: /protected/models/Posts.php):

<?php

class Posts extends CActiveRecord {

    public function tableName() {
        return 'posts';
    }

    public function rules() {
        return array(
            array('url, header, metaTitle', 'required'),
            array('shortText, text, metaKeywords, '
                . 'metaDescription, visibility, date, '
                . 'img, imgAlt, imgTitle', 'safe'),
            array('visibility', 'numerical', 'integerOnly' => true),
            array('url, header, metaTitle, '
                . 'metaKeywords, img, imgAlt, '
                . 'imgTitle', 'length', 'max' => 255),
            array('url', 'unique'),
            array('id, url, header, '
                . 'shortText, text, metaTitle, '
                . 'metaKeywords, metaDescription, '
                . 'visibility, date, img, '
                . 'imgAlt, imgTitle', 'safe', 'on' => 'search'),
        );
    }

    public function relations() {
        return array(
            //...
        );
    }

    public function attributeLabels() {
        return array(
            'id' => 'ID',
            'url' => 'Url',
            'header' => 'Заголовок',
            'shortText' => 'Краткий текст',
            'text' => 'Текст',
            'metaTitle' => 'Meta Title',
            'metaKeywords' => 'Meta Keywords',
            'metaDescription' => 'Meta Description',
            'visibility' => 'Выводить',
            'date' => 'Дата',
            'img' => 'Изображение',
            'imgAlt' => 'Alt для изображения',
            'imgTitle' => 'Title для изображения',
        );
    }

    public function search() {
        $criteria = new CDbCriteria;
        
        $criteria->compare('id', $this->id);
        $criteria->compare('url', $this->url, true);
        $criteria->compare('header', $this->header, true);
        $criteria->compare('shortText', $this->shortText, true);
        $criteria->compare('text', $this->text, true);
        $criteria->compare('metaTitle', $this->metaTitle, true);
        $criteria->compare('metaKeywords', $this->metaKeywords, true);
        $criteria->compare('metaDescription', $this->metaDescription, true);
        $criteria->compare('visibility', $this->visibility);
        $criteria->compare('date', $this->date);
        $criteria->compare('img', $this->img);
        $criteria->compare('imgAlt', $this->imgAlt);
        $criteria->compare('imgTitle', $this->imgTitle);

        return new CActiveDataProvider($this, array(
            'criteria' => $criteria,
        ));
    }

    public static function model($className = __CLASS__) {
        return parent::model($className);
    }

}

Теперь перейдем к контроллеру (controller) управления нашими записями. Приведем пример стандартных действий (actions) добавления/редактирования для статей (путь к контроллеру /protected/modules/admin/controllers/PostsController.php):

<?php

class PostsController extends BackEndController {
    
    //...код...
    
    public function actionAdd() {
        $model = new AdminPosts;
        $this->breadcrumbsTitle = $this->pageHeader = $this->pageTitle = 'Добавление записи';
        $this->breadcrumbs = array(
            'Записи' => '/posts',
            $this->breadcrumbsTitle
                );
        if (isset($_POST['AdminPosts']) && !isset($_POST['yt2'])) {
            $model->attributes = $_POST['AdminPosts'];
            if ($model->save()) {
                Yii::app()->user->setFlash('success', 'Запись успешно добавлена.');
                Yii::app()->request->redirect(
                        (isset($_POST['yt1']) ? 
                        '/posts' : 
                        '/admin/posts/edit/' . $model->id)
                        );
            } else {
                Yii::app()->user->setFlash('error', 'Проверте поля еще раз.');
            }
        }
        $this->render('_form', array('model' => $model));
    }

    public function actionEdit($id) {
        $model = AdminPosts::model()->findByPk($id);
        $model->oldImg = $model->img;
        $this->breadcrumbsTitle = $this->pageHeader = $this->pageTitle = 'Редактирование записи';
        $this->breadcrumbs = array(
            'Записи' => '/posts',
            $this->breadcrumbsTitle
                );
        if (isset($_POST['AdminPosts']) && !isset($_POST['yt2'])) {
            $model->attributes = $_POST['AdminPosts'];
            if ($model->save()) {
                Yii::app()->user->setFlash('success', 'Запись успешно отредактирована.');
                Yii::app()->request->redirect(
                        (isset($_POST['yt1']) ? 
                        '/posts' : 
                        '/admin/posts/edit/' . $model->id)
                        );
            } else {
                Yii::app()->user->setFlash('error', 'Проверьте поля еще раз.');
            }
        }
        $this->render('_form', array('model' => $model));
    }
    
}

Далее пример представления (view) формы для редактирования/добавления статьи (путь к view: /themes/themeName/views/admin/posts/_form.php):

<div class="page-header">
    <h1><?php echo $this->pageHeader; ?></h1>
</div>
<?php
$form = $this->beginWidget('CActiveForm', array(
    'focus' => array($model, 'header'),
    'htmlOptions' => array(
        'class' => '',
        'enctype' => 'multipart/form-data',
        'role' => 'form'
    ),
    'clientOptions' => array(
        'validateOnSubmit' => false,
        'validateOnChange' => true,
        'validateOnType' => false,
        'errorCssClass' => 'has-error',
    ),
        ));
?>
<small>Поля отмеченные <span class="required">*</span> обязательны  для заполнения</small>

<div class="checkbox">
    <label>
        <?php echo $form->checkBox($model, 'visibility', array('class' => '')); ?>
        <span class="lbl"><?php echo $form->label($model, 'visibility', array()); ?></span>
    </label>    
</div>

<div class="form-group">
    <?php echo $form->labelEx($model, 'header'); ?>
    <?php echo $form->textField($model, 'header', array('class' => 'form-control')); ?>
    <?php echo $form->error($model, 'header'); ?>
</div>

<div class="form-group">
    <?php echo $form->labelEx($model, 'url'); ?>
    <?php echo $form->textField($model, 'url', array('class' => 'form-control')); ?>
    <?php echo $form->error($model, 'url'); ?>    
</div>

<div class="form-group">
    <?php echo $form->labelEx($model, 'date'); ?>
    <?php echo $form->textField($model, 'date', array('class' => 'form-control')); ?>
    <?php echo $form->error($model, 'date'); ?>
</div>

<div class="form-group">
    <?php echo $form->labelEx($model, 'metaTitle'); ?>
    <?php echo $form->textField($model, 'metaTitle', array('class' => 'form-control')); ?>
    <?php echo $form->error($model, 'metaTitle'); ?>
</div>

<div class="form-group">
    <?php echo $form->labelEx($model, 'metaKeywords'); ?>
    <?php echo $form->textField($model, 'metaKeywords', array('class' => 'form-control')); ?>
    <?php echo $form->error($model, 'metaKeywords'); ?>
</div>
<div class="form-group">
    <?php echo $form->labelEx($model, 'metaDescription'); ?>
    <?php echo $form->textField($model, 'metaDescription', array(
        'class' => 'form-control', 
        'rows' => 3)
            ); ?>
    <?php echo $form->error($model, 'metaDescription'); ?>
</div>

<div class="form-group">
    <?php echo $form->labelEx($model, 'shortText'); ?>
    <?php echo $form->textArea($model, 'shortText', array(
        'class' => 'form-control', 
        'rows' => 10, 
        'id' => 'editor-desc')
            ); ?>
    <?php echo $form->error($model, 'shortText'); ?>
</div>

<div class="form-group">
    <?php echo $form->labelEx($model, 'text'); ?>
    <?php echo $form->textArea($model, 'text', array(
        'class' => 'form-control', 
        'rows' => 35, 'id' => 'editor-text')
            ); ?>
    <?php echo $form->error($model, 'text'); ?>
</div>

<h4>Изображение (200x150)</h4>
<table class="table">
    <tr>
        <td>
            <div class="input-group">
                <?php echo $form->labelEx($model, 'img'); ?>
                <?php echo $form->fileField($model, 'img', array(
                    'class' => 'btn btn-default form-control', 
                    'title' => 'Выберите изображение', 
                    'accept' => 'image/gif, image/jpeg, image/png')
                        ); ?>
                <?php echo $form->error($model, 'img', array('class' => 'help-block small')); ?>
            </div>

            <div class="form-group">
                <?php echo $form->labelEx($model, 'imgAlt'); ?>
                <?php echo $form->textField($model, 'imgAlt', array('class' => 'form-control')); ?>
                <?php echo $form->error($model, 'imgAlt', array('class' => 'help-block small')); ?>
            </div>
            
            <div class="form-group">
                <?php echo $form->labelEx($model, 'imgTitle'); ?>
                <?php echo $form->textField($model, 'imgTitle', array('class' => 'form-control')); ?>
                <?php echo $form->error($model, 'imgTitle', array('class' => 'help-block small')); ?>
            </div>

        </td>
        <td class="pre-img<?php echo ($model->isNewRecord ? ' hidden' : ''); ?>">
            Вывод превью изображения и кнопка удаления изображения
        </td>
    </tr>
</table>
<div class="form-actions">
    <button type="submit" name="yt0" class="btn btn-info">
        <i class="icon-ok bigger-110"></i>
        Сохранить
    </button>
         
    <button type="submit" class="btn btn-primary" name="yt1">
        <i class="icon-arrow-right icon-on-right bigger-110"></i>
        Сохранить и выйти
    </button>
         
    <button type="reset" class="btn">
        <i class="icon-undo bigger-110"></i>
        Отмена
    </button>
</div>
<?php
$this->endWidget();

И модель статей в которой мы будем обрабатывать и загружать изображения (путь к модели: /protected/modules/admin/models/AdminPosts.php):

<?php

class AdminPosts extends Posts {

    /**
     * Имя старого изображения
     * 
     * @var string
     */
    public $oldImg = '';

    static function model($className = __CLASS__) {
        return parent::model($className);
    }

    /**
     * Действия перед сохранением записи
     * 
     * @return boolean
     */
    protected function beforeSave() {
        $this->img = $this->oldImg;
        parent::beforeSave();
        return true;
    }

    /**
     * Действия после сохранения записи
     * 
     * @return boolean
     */
    protected function afterSave() {
        
        //...код...
        //
        //загружаем изображение
        $this->uploadImage();
        
        //...код...

        return parent::afterSave();
    }

    /**
     * Загрузка изображения
     * 
     * @return string - имя изображения
     */
    public function uploadImage() {

        $pathToFolder = Yii::getPathOfAlias('webroot') . '/images/posts/';
        if (empty($_FILES['AdminPosts'])) {
            return $this->oldImg;
        }        
        $imgName = $this->oldImg;
        
        Yii::import('application.extensions.upload.Upload');
        Yii::app()->setComponents(
                array('imagemod' => 
                    array('class' => 'application.extensions.imagemodifier.CImageModifier')
                    )
                );
        Yii::app()->imagemod->setLanguage('ru_RU');
        $handle = Yii::app()->imagemod->load($_FILES['AdminPosts']);
        if ($handle->uploaded) {
            //удаляем старое изображение
            $this->deleteImage();
            
            //путь к водяному знако для изображения
            $handle->image_watermark = Yii::getPathOfAlias('webroot') . 
                    '/images/watermark/watermark.png';
            //место размещения водяного знака на изображении
            $handle->image_watermark_position = 'BR';
            //имя файла сохраняем как есть
            $handle->file_safe_name = false;
            //не переименовывать имя файла
            $handle->file_auto_rename = false;
            //качество jpg = 100%
            $handle->jpeg_quality = 100;
            //разрешить изменение размера изображения
            $handle->image_resize = true;
            //не сохранить соотношения размеров
            $handle->image_ratio = false;
            //сохранить соотношение оригинальных размеров при подрезке
            $handle->image_ratio_crop = true;
            //ширина изображения
            $handle->image_x = 150;
            //высота изображения
            $handle->image_y = 200;
            //добавляем префикс к имени файла (в данном случае - это id записи)
            $handle->file_name_body_pre = $this->primaryKey . '-';
            $handle->process($pathToFolder);
            
            if ($handle->processed) {
                $imgName = $handle->file_dst_name;
                $handle->clean();
            } else {
                Yii::app()->user->setFlash('error', $handle->error);
            }
            
        }
        
        $this->isNewRecord = false;
        $this->saveAttributes(array('img' => $imgName));
        
        return $imgName;
    }

    /**
     * Удаление изображение
     * 
     * @return boolean
     */
    public function deleteImage() {
        $pathToFolder = Yii::getPathOfAlias('webroot') . '/images/posts/';
        if (file_exists($pathToFolder . $this->img)) {
            unlink($pathToFolder . $this->img);
            $this->isNewRecord = false;
            $this->saveAttributes(array($fieldImage => ''));
            return true;
        } else {
            return false;
        }
    }

}

Вот и все, приятной работы с изображениями при помощи расширения CImageModifier для Yii Framework.