CakePHP: Code/Helpers/ImageResizeHelper

Изменяем размер изображения

Автор Josh Hundley, известный так же как “hundleyj”

Я сейчас пишу онлайн-магазин на CakePHP и мне понадобился помощник, который изменял бы размер изображений, чтобы показывать на сайте эскизы (thumbnails).

Этот помощник изменит размер изображения «на лету» и сохранит его в кеше, чтобы в дальнейшем использовать готовое превью. Вам необходимо убедиться, что каталог imagecache доступен для записи. Будущие версии помощника возможно будут включать кадрирование изображения.

<?php 

class ImageHelper extends Helper {

    var $helpers = array('Html');

    

    var $cacheDir 'imagecache'// relative to IMAGES_URL path

    

/**

 * Автоматически изменяет размер изображения и возвращает форматированный IMG тег.

 *

 * @param string $path Путь до картинки, которая должна находиться внутри директории webroot/img/.

 * @param integer $width Ширина создаваемого изображения

 * @param integer $height Высота создаваемого изображения

 * @param boolean $aspect Сохранять ли пропорции (default: true)

 * @param array    $htmlAttributes Массив HTML атрибутов.

 * @param boolean $return Вернуть результат из метода или вывести его в общий поток. Это будет перекрывать AUTO_OUTPUT.

 * @return mixed    Возвращает строку или результат функции echo, в зависимости от параметра $return.

 * @access public

 */

    function resize($path$width$height$aspect true$htmlAttributes = array(), $return false) {

        

        $types = array(=> "gif""jpeg""png""swf""psd""wbmp"); // используется для определения типа изображения

        

        $fullpath ROOT.DS.APP_DIR.DS.WEBROOT_DIR.DS.$this->themeWeb.IMAGES_URL;

    

        $url $fullpath.$path;

        

        if (!($size getimagesize($url))) 

            return; // не существует такого изображения

            

        if ($aspect) { // считаем пропорции, если нас просили об этом

            if (($size[1]/$height) > ($size[0]/$width))  // $size[0]:width, [1]:height, [2]:type

                $width ceil(($size[0]/$size[1]) * $height);

            else 

                $height ceil($width / ($size[0]/$size[1]));

        }

        

        

        $relfile $this->webroot.$this->themeWeb.IMAGES_URL.$this->cacheDir.'/'.$width.'x'.$height.'_'.basename($path); // расположение файла

        $cachefile $fullpath.$this->cacheDir.DS.$width.'x'.$height.'_'.basename($path);  // расположение на сервере

        

        if (file_exists($cachefile)) {

            $csize getimagesize($cachefile);

            $cached = ($csize[0] == $width && $csize[1] == $height); // изображение есть в кеше

            if (@filemtime($cachefile) < @filemtime($url)) // проверяем дату кеша

                $cached false;

        } else {

            $cached false;

        }

        

        if (!$cached) {

            $resize = ($size[0] > $width || $size[1] > $height) || ($size[0] < $width || $size[1] < $height);

        } else {

            $resize false;

        }

        

        if ($resize) {

            $image call_user_func('imagecreatefrom'.$types[$size[2]], $url);

            if (function_exists("imagecreatetruecolor") && ($temp imagecreatetruecolor ($width$height))) {

                imagecopyresampled ($temp$image0000$width$height$size[0], $size[1]);

              } else {

                $temp imagecreate ($width$height);

                imagecopyresized ($temp$image0000$width$height$size[0], $size[1]);

            }

            call_user_func("image".$types[$size[2]], $temp$cachefile);

            imagedestroy ($image);

            imagedestroy ($temp);

        }         

        

        return $this->output(sprintf($this->Html->tags['image'], $relfile$this->Html->parseHtmlOptions($htmlAttributesnull''' ')), $return);

    }

?>

Используем помощника так:

<? echo $image->resize('myimage.jpg'150150true?>