Класс для обработки изображений by Koenig

3.46K
.
Screamer
Сложно оценить из-за полного отсутствия комментариев.
Непонятно зачем два раза подряд устанвливать прозрачность для gif imagecolortransparent($tmp, imagecolorallocate($tmp, 255, 255, 255));
imgout вместо массива лучше аргументы использовать как мне кажется. Да и префикс img убрать, итак понятно, что изображение выводим, а не что то еще.

Что касается newx() и newy(), то на первый взгляд я подумал, что эти методы устанавливают новую ширину и новую высоту для пикчи, пока не заглянул в тело каждого из этих методов. И почему бы сразу в конструкторе не создать свойства и установить их значения, чем дёргать каждый раз imagesx и imagesy
Свойства сделать приватными и установить для них сеттеры и геттеры. Через сеттеры изображение будет ресайзится. Так помоему гораздо удобнее.

метод copyright()
Тут я как понял можно только задать текст и угол наклона.
Было бы не плохо, чтобы можно было задать позицию, шрифт, размер, прозрачность и т.д.
Позиции хотябы просто top, left, right, bottom, middle с возможностью их комбинирования. И тогда уже назвать его не copyright а watermark например.

Деструкор. Вместо unset может лучше использовать null? И переместить его код в отдельный метод clear например. Чтобы можно было использовать объект для нескольких изображений, а не создавать для каждого новый.
А так в деструкторе нет смысла в том виде в котором он сейчас, т.к. он вызывается при уничтожении объекта.

Ну и комментарии, комментарии. Не можешь в php-doc, тогда хотябы просто обычные комментарии, хотябы на русском, а то увидев в первые этот класс у меня сразу отпало бы желание его использовать.
.
Ей 25
Нормально. Думаю пригодится, когда буду что-то связанное с картинками писать.
С комментариями было бы конечно лучше, но и так практически всё понятно.
.
(\/)____o_O____(\/)
Screamer (21.07.2013 / 19:54)
Сложно оценить из-за полного отсутствия комментариев.
Непонятно зачем два раза подряд устанвливать прозрачность для gif imagecolortransparent($tmp, imagecolorallocate($tmp, 255, 255, 255));
imgout в
первое согласен, недосмотр два раза прозрачность, убрал
второе, когда крутишь изображение они меняются, и когда ресайз делаешь
может не понял тебя, пример бы
третье , одно изображение один объект
$args = array('type' => 'jpeg', 'newfile' => 'test2res', 'quality' => 100);
$img->imgout($args); 
$img->imgout(); 
// вывод на экран и сохранение локальной копии
.
(\/)____o_O____(\/)
Screamer, с копирайтом засада, если в другие углы пихать, надо мозг ломать как посчитать координаты, количество сиволов плюс от угла отступ и прочее, если видел где дай посмотреть
.
(\/)____o_O____(\/)
Screamer,
<?php

/**
* Koeimg
* 
* Обработка изображения, возможность изменения размеров пропорционально, задав ширину или длину, не пропорциональное изменение размера указать ширину и длину,
* изменение размера пропорционально в процентном соотношении, зеркальное отражение исходного изображения, получить размеры ширины или высоты изображенияб
* поворот изображение на определенный угол, сделать чб, наложение копирайта на левый верхний или левый нижний углы
* 
* @author Koenig <http://johncms.com/users/profile.php?user=6565>
* @version 1.0
*/

class Koeimg
{      
   /**
   * ширина изображения
   * 
   * @var integer 
   */
    private $width;
    /**
   * высота изображения
   * 
   * @var integer 
   */
    private $height;
    /**
   * тип изображения
   * 
   * @var string 
   */
    private $type;
    /**
   * ресурс изображения
   * 
   * @var resource 
   */
    private $img;
    /**
   * массив типов
   * 
   * @var array 
   */
    private $imgtypes = array(
        'jpg',
        'jpeg',
        'gif',
        'png'
    );
    /**
   * конструктор
   * 
   * @param string ссылка на файл изображения
   * @return resource
   */
    public function __construct($imgfile)
    {
        if (!file_exists($imgfile)) {
            throw new Exception('file not exists');
        }
        $imgtypes = array(
            'jpg',
            'jpeg',
            'gif',
            'png'
        );
        $ext = explode('.', $imgfile);
        $ext = end($ext);
        if (!in_array($ext, $this->imgtypes)) {
            throw new Exception('unsupported image type');
        }
        $info = getimagesize($imgfile);
        $this->width = $info[0];
        $this->height = $info[1];
        $this->type = $info['mime'];
        $this->type = strtolower(substr($this->type, strpos($this->type, '/') + 1));
        $imgfunc = 'imagecreatefrom' . $this->type;
        if (!function_exists($imgfunc)) {
            throw new Exception('unsupported function ' . $imgfunc);
        }
        $this->img = $imgfunc($imgfile);
        $newimg = imagecreatetruecolor($this->width, $this->height);
        if ($this->type == 'gif') {
            $newimg = imagecreate($this->width, $this->height);
            imagecolortransparent($newimg, imagecolorallocate($newimg, 255, 255, 255));
        }
        if ($this->type == 'png') {
            imagefill($newimg, 0, 0, imagecolorallocate($newimg, 255, 255, 255));
        }
        imagecopyresampled($newimg, $this->img, 0, 0, 0, 0, $this->width, $this->height, $this->width, $this->height);
        $this->img = $newimg;
    }
   /**
   * вывод
   * 
   * @param array массив с параметрами
   * @return вывод изображение на страницу через заголовок или сохранить локально
   */
    public function out($mode = array())
    {
   /**
   * массив параметров по умолчанию
   * тип
   * имя файла без расширения
   * качество изображения только для png и jpg
   * фильтр только для png
   * 
   * @var array 
   */
        $defaultmode = array(
            'type' => 'png',
            'newfile' => null,
            'quality' => 9,
            'filters' => PNG_ALL_FILTERS
        );
        foreach($defaultmode as $k => $v) {
            if (!isset($mode[$k])) {
                $mode[$k] = $v;
            }
        }
        $imgfuncout = 'image' . $mode['type'];
        if (!function_exists($imgfuncout)) {
            throw new Exception('unsupported function ' . $imgfuncout);
        }
        if ($mode['newfile'] == null) {
            header('Content-Type: image/' . $mode['type']);
        }
        else {
            $mode['newfile'] = $mode['newfile'] . '.' . $mode['type'];
        }
        switch ($mode['type']) {
        case 'gif':
            $imgfuncout($this->img, $mode['newfile']);
            break;

        case 'jpeg':
            $imgfuncout($this->img, $mode['newfile'], $mode['quality']);
            break;

        default:
            $imgfuncout($this->img, $mode['newfile'], $mode['quality'], $mode['filters']);
            break;
        }
    }
    public function copyright($text, $angle = 1)
    {
   /**
   * наложение копирайта
   * 
   * @param string текст копирайта
   * @param interer угол 
   * 1 - левый нижний
   * 2 - левый верхний
   * @return resource 
   */    
        $newimg = imagecreatetruecolor($this->width, 17);
        $white = imagecolorallocate($newimg, 0, 0, 0);
        $grey = imagecolorallocate($newimg, 128, 128, 128);
        $blue = imagecolorallocate($newimg, 0, 128, 128);
        $red = imagecolorallocate($newimg, 255, 0, 0);
        $black = imagecolorallocate($newimg, 255, 255, 255);
        imagecolortransparent($newimg, $white);
        imagefilledrectangle($newimg, 0, 0, 69, 14, $white);
        $font = 'arial.ttf';
        imagettftext($newimg, 12, 0, 5, 14, $red, $font, $text);
        imagettftext($newimg, 12, 0, 4, 13, $blue, $font, $text);
        imagettftext($newimg, 12, 0, 3, 12, $black, $font, $text);
        imagecopymerge($this->img, $newimg, 0, ($angle == 1 ? $this->height - 17 : 0) , 0, 0, $this->width, $this->height, 100);
    }
    public function mirroring()
    {
    /**
   * отображение в зеркале
   * @return resource 
   */    
        $newimg = imagecreatetruecolor($this->width, $this->height);
        foreach(range($this->width, 0) as $range) {
            imagecopy($newimg, $this->img, $this->width - $range - 1, 0, $range, 0, 1, $this->height);
        }
        $this->img = $newimg;
    }
    public function rotate($angle = 90)
    {
   /**
   * поворот изображения
   * @param integer угл наклона 0 - 359
   * default 90
   * @return resource 
   */    
        $white = imagecolorallocate($this->img, 255, 255, 255);
        imagecolortransparent($this->img, $white);
        $this->img = imagerotate($this->img, $angle, $white);
        $this->width = $this->newx();
        $this->height = $this->newy();
    }
    public function grayscale()
    {
   /**
   * создание чернобелого изображения
   * @return resource 
   */    
        imagefilter($this->img, IMG_FILTER_GRAYSCALE);
    }
    public function reheight($height)
    {
   /**
   * пропорциональное изменение по высоте
   * @param integer новая длина
   * @return resource 
   */     
        $width = $this->newx() * ($height / $this->newy());
        $this->resize($width, $height);
    }
    public function rewidth($width)
    {
   /**
   * пропорциональное изменение по ширине
   * @param integer новая ширина
   * @return resource 
   */     
        $height = $this->newy() * ($width / $this->newx());
        $this->resize($width, $height);
    }
    public function scale($scale)
    {
   /**
   * пропорциональное изменение по ширине и высоте в процентах
   * @param integer процент
   * @return resource 
   */    
        $width = $this->newx() * ($scale / 100);
        $height = $this->newy() * ($scale / 100);
        $this->resize($width, $height);
    }
    public function resize($width, $height)
    {
   /**
   * изменение по ширине и высоте
   * @param integer новая ширина
   * @param integer новая высота
   * @return resource 
   */     
        $newimg = imagecreatetruecolor($width, $height);
        imagecopyresampled($newimg, $this->img, 0, 0, 0, 0, $width, $height, $this->newx() , $this->newy());
        $this->img = $newimg;
        $this->width = $this->newx();
        $this->height = $this->newy();
    }
    public function newx()
    {
   /**
   * получение ширины изображения
   * @return integer
   */     
        return imagesx($this->img);
    }
    public function newy()
    {
   /**
   * получение высоты изображения
   * @return integer 
   */     
    
        return imagesy($this->img);
    }
    public function __destruct()
    {
   /**
   * деструктор
   * @return null
   */    
        imagedestroy($this->img);
        foreach($this as $key => $value) {
            unset($this->$key);
        }
    }
}
?>
Прикрепленные файлы:
.
Koenig, насчет вращения не подумал, но и там можно их устанавливать отдельно внутри класса. А про ресайз уже говорил.
Вот пример вобщем
<?php

class Image {

private $height;
private $width;

public function __construct($path)
{
# code...
$this->width = imagesx($image);
$this->height = imagesy($image);
}

public function set_width($width) {
$this->width = $width;
// Resize ...
}

public function set_height($height) {
$this->height = $height;
// Resize ...
}

public function rotate() {
// Rotate ..
$this->width = imagesx($image);
$this->height = imagesy($image);
}

public function get_width() {
return $this->width;
}

public function get_height() {
return $this->height;
}

}

Ну а раз для каждого изображения один объект, то тогда всё понятно.
Но всё равно в деструкторе не вижу смысла. Всё и так удалится.
А если нужно освободить память, то просто присваивай ссылке на объект значение null
.
Koenig, Перед объявлением метода, а не в теле DOC-комментарии ставятся
.
Screamer
Насчет копирайта незнаю, поищи подобные классы на гитхабе,там это должно быть

Если метод ничего не возвращает, то обычно пишут void
.
Вобщем вот http://www.phpdoc.org/docs/lat ... .html
.
(\/)____o_O____(\/)
Screamer, после поворота надо по новой определять imagesx() imagesy() , так как ты повернул его, причем в каждом методе нужно, проще присвоить новое изображение в свойство и получить новые значения через методы записав их в свойства
Всего: 107