CImageHandler - работа с изображениями

Выкладываем свои наработки
Аватара пользователя
Tokolist
Сообщения: 113
Зарегистрирован: 2010.03.01, 22:03

CImageHandler - работа с изображениями

Сообщение Tokolist »

Мой велосипед для работы с изображениями.
Требования те же что и у Yii плюс библиотека GD.

Возможности:
- работает с JPG, PNG, GIF
- сохранение прозрачности при работе с PNG и GIF
- комбинирование нескольких операций над одной картинкой
- загрузка из любого и сохранение в любой из поддерживаемых форматов

Подключение:

1. Закинуть файл в папку components
2. в config/main.php

Код: Выделить всё

'components'=>array(

    ...

    'ih'=>array(
        'class'=>'CImageHandler',
    ),

    ...

) 
или можно просто создавать экземпляр класса

Код: Выделить всё

$ih = new CImageHandler(); 
:?: Документация (рус)
:?: Документация (eng)
:arrow: Скачать
Последний раз редактировалось Tokolist 2012.12.02, 22:16, всего редактировалось 16 раз.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: CImageHandler - работа с изображениями

Сообщение samdark »

Полезно. Вот только как-то более человечно использовать ImageMagick.
nagash
Сообщения: 35
Зарегистрирован: 2010.03.30, 14:26
Откуда: Украина, г. Сумы

Re: CImageHandler - работа с изображениями

Сообщение nagash »

Такое прокатит, или потребуется сначала сохранить картинку?

Код: Выделить всё

Yii::app()->ih
    ->load($_FILES['img']['tmp_name'])
    ->thumb(200, 200)
    ->save($_SERVER['DOCUMENT_ROOT'] . '/upload/image2.jpg'); 
 
Аватара пользователя
Tokolist
Сообщения: 113
Зарегистрирован: 2010.03.01, 22:03

Re: CImageHandler - работа с изображениями

Сообщение Tokolist »

Sam Dark писал(а):Полезно. Вот только как-то более человечно использовать ImageMagick.
Спасибо. Мне GD ближе почему-то. Гибче что-ли :) ImageMagick, если честно, никогда не пользовался да и библиотека как-то субъективно лучше чем вызов консольного приложения. :roll:
nagash писал(а):Такое прокатит, или потребуется сначала сохранить картинку?

Код: Выделить всё

Yii::app()->ih
    ->load($_FILES['img']['tmp_name'])
    ->thumb(200, 200)
    ->save($_SERVER['DOCUMENT_ROOT'] . '/upload/image2.jpg'); 
 
Да, конечно)
Аватара пользователя
timlar
Сообщения: 1382
Зарегистрирован: 2009.09.19, 17:49
Откуда: Украина, Днепропетровск
Контактная информация:

Re: CImageHandler - работа с изображениями

Сообщение timlar »

Tokolist писал(а):Спасибо. Мне GD ближе почему-то. Гибче что-ли :) ImageMagick, если честно, никогда не пользовался да и библиотека как-то субъективно лучше чем вызов консольного приложения. :roll:
Зря ты так :) ImageMagick получше будет :) Image Processing (ImageMagick)
Twitter: @timlar_ua
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: CImageHandler - работа с изображениями

Сообщение Ekstazi »

Думаю как плагин поддержку ImageMagick стоило бы добавить
Аватара пользователя
Tokolist
Сообщения: 113
Зарегистрирован: 2010.03.01, 22:03

Re: CImageHandler - работа с изображениями

Сообщение Tokolist »

да... похоже я отстал от жизни))
следующая версия будет с возможностью выбора между GD и ImageMagick
Аватара пользователя
alexzv
Сообщения: 120
Зарегистрирован: 2010.04.23, 00:10
Откуда: Украина, Киев

Re: CImageHandler - работа с изображениями

Сообщение alexzv »

Не очень удобно, что нельзя загрузить картинку по URL. По этому остановился на EasyPhpThumb. Только вот не проверял пока, как он дружит с прозрачными PNG...
Аватара пользователя
Tokolist
Сообщения: 113
Зарегистрирован: 2010.03.01, 22:03

Re: CImageHandler - работа с изображениями

Сообщение Tokolist »

alexzv писал(а):Не очень удобно, что нельзя загрузить картинку по URL. По этому остановился на EasyPhpThumb. Только вот не проверял пока, как он дружит с прозрачными PNG...
Это все моя параноидальность) Убрал проверку на существование файла. Теперь можно.

Код: Выделить всё

Yii::app()->ih
    ->load('http://www.google.com.ua/intl/en_com/images/srpr/logo1w.png')
    ->flip(CImageHandler::FLIP_VERTICAL)
    ->show(); 
Только вот, там походу два раза сервер дергать будет:
1. getimagesize
2. imagecreatefrompng
Последний раз редактировалось Tokolist 2010.05.24, 17:50, всего редактировалось 1 раз.
Аватара пользователя
alexzv
Сообщения: 120
Зарегистрирован: 2010.04.23, 00:10
Откуда: Украина, Киев

Re: CImageHandler - работа с изображениями

Сообщение alexzv »

Отлично, что теперь работает с изображениями по URL. Можно ли добавить еще несколько функций, которые бы расширили функциональность? Это Adaptive Resizing - вписывание картинки в определенные размеры, фактически resize по меньшей стороне и потом центрированная обрезка. Есть в стандартном PHP Thumb, так и называется - adaptiveResize ($width, $height).

И вторая, то что я назвал resizeCanvas($width, $height, $bgcolor=array(255,255,255)) - то есть, создается новое изображение указанных размеров, с заданным цветом фона и в него вписывается исходное изображение (по центру). Это нужно, когда изображение должно быть определенного размера, но при этом не искаженным и не обрезанным.

Для себя я все это добавил в EasyPhpThumb, но с радостью бы перешел на Вашу библиотеку, так как она мне кажется более гибкой... Почему цвет фона в виде массива? Да просто потому, что:

Код: Выделить всё

$background_color = imagecolorallocate($this->workingImage, $bgcolor[0], $bgcolor[1], $bgcolor[2]); 
Аватара пользователя
Tokolist
Сообщения: 113
Зарегистрирован: 2010.03.01, 22:03

Re: CImageHandler - работа с изображениями

Сообщение Tokolist »

alexzv писал(а):Отлично, что теперь работает с изображениями по URL. Можно ли добавить еще несколько функций, которые бы расширили функциональность? Это Adaptive Resizing - вписывание картинки в определенные размеры, фактически resize по меньшей стороне и потом центрированная обрезка. Есть в стандартном PHP Thumb, так и называется - adaptiveResize ($width, $height).
Если я правильно понимаю, то это должно выглядеть так.
Изображение
Собственно, я как раз собирался ее реализовывать, т.к. мне тоже оказался необходимым такой функционал))
alexzv писал(а):И вторая, то что я назвал resizeCanvas($width, $height, $bgcolor=array(255,255,255)) - то есть, создается новое изображение указанных размеров, с заданным цветом фона и в него вписывается исходное изображение (по центру). Это нужно, когда изображение должно быть определенного размера, но при этом не искаженным и не обрезанным.
Как мне кажется, это лучше реализовывать средствами html и css. Фон будет поменять легче и картинки меньше места занимать будут. Вот так, например

Код: Выделить всё

a.thumb {
  display: block;
  width: 100px;
  height: 100px;
  background: #f00 url(image.jpg) no-repeat 50% 50%;
}
Но все же добавил метод.

Пример использования новых методов смотрите в конце самого первого поста.

Теперь класс может делать почти все из этой статьи http://habrahabr.ru/blogs/webdev/92237/

Еще хочу сделать возможность выбора между GD и Imagic, ну и все что в первом посте. Только катастрофически не хватает времени...
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: CImageHandler - работа с изображениями

Сообщение slavcodev »

пробежался глазком, хочу предложить если в методе crop поменять местами параметры, то можно избавится от метода cropCentered

Код: Выделить всё

/**
 * @param $startX mixed Если null то от центра, если положительное то координаты по Х от верхнего левого угла, 
 * если отрицательное то смещение от центра
 * @param $startY mixed тоже самое
*/
public function crop($width, $height, $startX=0, $startY=0)
{
//...
} 
Жду Yii 3!
Аватара пользователя
Tokolist
Сообщения: 113
Зарегистрирован: 2010.03.01, 22:03

Re: CImageHandler - работа с изображениями

Сообщение Tokolist »

mc-bear писал(а):пробежался глазком, хочу предложить если в методе crop поменять местами параметры, то можно избавится от метода cropCentered
Хорошее предложение, спасибо.
Теперь если $startX === false выравнивание производится по центру по горизонтали
если $startY === false выравнивание производится по центру по вертикали

Теперь еще если в save не указывать название файла, то будет заменен оригинальный файл.

Плюс если параметр $touch=true, то новому файлу будет установлена дата модификации оригинала. Т.е. можно делать динамическую генерацию картинок на основе оригинала и если оригинал не изменялся то не генерировать повторно.
Mougrim
Сообщения: 4
Зарегистрирован: 2010.05.23, 18:08

Re: CImageHandler - работа с изображениями

Сообщение Mougrim »

А есть возможность обрезки с дополнением? т.е. если изображение 100х50, а нужно изображение 70х70, т.е. в данном случае что бы изображение образелось по ширине и дополнилось по высоте
Аватара пользователя
Tokolist
Сообщения: 113
Зарегистрирован: 2010.03.01, 22:03

Re: CImageHandler - работа с изображениями

Сообщение Tokolist »

Mougrim писал(а):А есть возможность обрезки с дополнением? т.е. если изображение 100х50, а нужно изображение 70х70, т.е. в данном случае что бы изображение образелось по ширине и дополнилось по высоте
Ну, если я Вас правильно понимаю, то так

Код: Выделить всё

    Yii::app()->ih
        ->load($_SERVER['DOCUMENT_ROOT'] . '/upload/test.jpg')
        ->adaptiveThumb(70, 70)
        ->save($_SERVER['DOCUMENT_ROOT'] . '/upload/test2.jpg');  
oleg
Сообщения: 58
Зарегистрирован: 2010.04.20, 09:19
Откуда: Россия, Воронеж

Re: CImageHandler - работа с изображениями

Сообщение oleg »

Tokolist
В исходниках для скачивания забыл поправить метод adaptiveThumb (он использует старый метод cropCentered).

ЗЫ спасибо за отличное расширение, удобно пользоваться им :)
Аватара пользователя
Tokolist
Сообщения: 113
Зарегистрирован: 2010.03.01, 22:03

Re: CImageHandler - работа с изображениями

Сообщение Tokolist »

oleg
Спасибо, починил)
Аватара пользователя
Groonel
Сообщения: 10
Зарегистрирован: 2011.03.18, 15:58

Re: CImageHandler - работа с изображениями

Сообщение Groonel »

Думаю вместо

Код: Выделить всё

$_SERVER['DOCUMENT_ROOT'] . '/upload/image1.jpg' 
лучше писать

Код: Выделить всё

Yii::app()->basePath . '/../upload/image1.jpg' 
Спасибо за скрипт! Все наглядно и понятно.
Аватара пользователя
Tokolist
Сообщения: 113
Зарегистрирован: 2010.03.01, 22:03

Re: CImageHandler - работа с изображениями

Сообщение Tokolist »

Это просто примеры, можно писать путь как угодно)
У меня вот все руки не доходят до ImageMagic, но когда-нибудь это случится)
buzzman
Сообщения: 4
Зарегистрирован: 2011.05.31, 11:25

Re: CImageHandler - работа с изображениями

Сообщение buzzman »

Понимаю, что последний ответ был довольно таки давно, но поддерживается ли еще разработка расширения.
У меня в процессе работы возник вопрос, можно ли в функцию ->thumb() передать один из параметров false, чтобы ресайз шел пропорционально, но только используя один из параметров функции? Т.е. если мне нужно, чтобы все загруженные фото были точно 200px по ширине, а высота не имеет значения.
Ответить