Создание миниатюр на CodeIgniter

При беглом изучении документации фреймворка CodeIgniter может сложиться впечатление, что он без проблем решит задачу создания миниатюр, и отчасти это так. Не вдаваясь влишние подробности перейду сразу к делу. Мне понадобилось сделать квадратную миниатюру из прямоугольного изображения, оказалось что без "танцев с бубном", средствами библиотеки Image_lib этого не сделать.

За определение размеров изображения отвечает параметр master_dim, который может иметь 3 значения: width, height, и auto. При использовании параметра width и height указывается фиксированный размер по одной из сторон, а другая вычисляется фреймворком автоматически. А при использовании auto фреймворк сам определяет большую сторону. Проблема в том, что для того чтобы кубировать изображение нужно определять меньшую сторону.

В сети можно найти несколько сильно модифицированных версий библиотек, решающих эту проблему. Я считаю идеологически неверным расширять библиотеки фреймворка, но в данном случае без этого не обойтись. Чтобы изменения в коде были минимальными, я создаю квадратную миниатюру за 2 этапа. Первым создается прямоугольная миниатюра с определением меньшей стороны, а вторым она кадрируется до нужного размера, кстати это может быть не только квадрат.

Со вторым этапом фреймворк справляется на ура, а для первого я сделал свою модификацию библиотеки Image_lib: [code] class MY_Image_lib extends CI_Image_lib {

function image_reproportion()
{   
    if (! is_numeric($this->width) OR ! is_numeric($this->height) OR $this->width == 0 OR $this->height == 0 ) return;
    if (! is_numeric($this->orig_width) OR ! is_numeric($this->orig_height) OR $this->orig_width == 0 OR $this->orig_height == 0) return;

    $new_width  = ceil($this->orig_width * $this->height / $this->orig_height);
    $new_height = ceil($this->width * $this->orig_height / $this->orig_width);

    $ratio = (($this->orig_height / $this->orig_width) - ($this->height / $this->width));

    if ($this->master_dim != 'width' AND $this->master_dim != 'height')
    {
        if (strcasecmp($this->master_dim, 'auto') === 0)
        {
            $this->master_dim = ($ratio < 0) ? 'width' : 'height';
        }
        else
        {   
            $this->master_dim = ($ratio < 0) ? 'height' : 'width';
        }
    }

    if (($this->width != $new_width) AND ($this->height != $new_height))
    {
        if ($this->master_dim == 'height')
        {
            $this->width = $new_width;
        }
        else
        {
            $this->height = $new_height;
        }
    }
}     

} [/code] Теперь, можно использовать как и раньше для параметра master_dim значения width, height, и auto, а если задать этому параметру любое другое значение, то базовая ось будет вычислена автоматически, как и в случае с авто, но не по большей, а по меньшей стороне.

20.09.2010