Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Класс для работы с изображениями class cms_img
Функции класса:
— Создание нового изображения с указанными размерами и цветом. или просто загружаем существующее (можно через URL-CURL ).
— Наложение логотипа в любой угол изображения
— Изменение изображения, если установить ширину и высоту равной, то деформация незаметна
— Наложение текста, тут полная функциональность, можно выбрать: координаты, прозрачность надписи, угол надписи, цвет надписи
— сохранение и вывод изображения (можно 2 в 1, а можно сохранять на разных этапах создания).
P.S. Данный класс сделан конкретно для использования GD, ImageMagick — это отдельная тема, поэтому пока прошу ее опустить.
Покинул форум
Сообщений всего: 528
Дата рег-ции: Май 2010 Откуда: Minsk
Помог: 3 раз(а)
Вот и комментарии:
1. Уже давно php 5 c областями видимости. Зачем свойства класса определять как public. Это будет вводить в заблуждение пользователей данного класса.
2. Никакой обработки ошибок. Вот взял я ваш класс, а он не работает. И как мне узнать, что не работает? Возьму я в try-catch блок вызов класса. А throw нигде не пробрасывается.
3. $this->coordinate и $this->coordinat. Может стоит назвать получше. Вообще, с названиями у вас плохо.
4. У вас много переменных внутри методов, которые не инициализированы в начале класса. Это неудобно.
5. В некоторых методах слишком много конструкций if. Проще заменить на switch.
6. Ну и, конечно же, велосипед)
Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008 Откуда: Крым
Помог: 11 раз(а)
garvey
0) Отвечаю на половину вопросов сразу, я не претендую на нобелевскую премию и т.д. Я написал класс для своих нужд.
1) По поводу облости видимости - прав, со временем доведу класс до ума, но пока некогда этим заниматся, главное я свои задачи решил
2) По поводу ошибок так же можно поправить, но повторюсь класс сделан для меня, а я первое все ошибки проверяю сам, а если, что не будет работать - быстро найду, со временем так же можно и обработку будет реализовать.
3) $this->coordinate - обрати внимание, что это свойство передается в методе setlogo вторым аргументом. И передавать ее другим способом не стоит. Не спорю виноват я, но я писал для себя, а остальным если подойдет, то пожалуйста я не жадный, вопросы просто такого плана задаются часто, а тут неплохое решение выложил.
4) Если я решу сделать это на совесть и выкладывать, как продукт, пускай даже бесплатный, то обязательно доведу класс до ума, проставлю везде комментарии и т.д.
5) Реально не вижу в данном случае преимуществ switch перед if - и это уже вопрос стиля, а не корректности кода.
6) Ну тут уже не раз ответил. Я написал для себя. Для многих это будет выход. Заниматься доведением до ума, чтоб это было очень красиво и понятно всем - сори пока нет времени.
P.S. Если есть желающие, которые сами все поправят - пожалуйста.
garvey
Отправлено: 05 Марта, 2011 - 14:54:06
Частый посетитель
Покинул форум
Сообщений всего: 528
Дата рег-ции: Май 2010 Откуда: Minsk
Помог: 3 раз(а)
На самом деле, я одобряю написание велосипедов. Они порой помогают больше вникнуть в суть проблемы. Ну если для своих нужд, то для начала сойдет) Желаю удачи в совершенствовании класса.
Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008 Откуда: Крым
Помог: 11 раз(а)
garvey
Ну там только изменение размеров изображения, мне то нужно было вставлять логотип и надписи, притом - функционально, поэтому так много настроек особенно для метода text() .
garvey
Отправлено: 05 Марта, 2011 - 16:17:11
Частый посетитель
Покинул форум
Сообщений всего: 528
Дата рег-ции: Май 2010 Откуда: Minsk
Помог: 3 раз(а)
Да ладно. Я уже не спорю, что класс не велосипед. Но подкорректировать ег стоит)
Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008 Откуда: Крым
Помог: 11 раз(а)
garvey
Муза моя придет и тогда обязательно подкорректирую))) Тем более, что там ничего существенного нет. Главное, что я при изменении изображения проверяю данные, чтоб ужаса не было.
Кстати пока гулял ))) Возникла идея кэшировать изображение, только вот думаю как лучше, есть 2 варианта склоняюсь к реализации обоих одновременно (можно переключать).
1) Кэшировать с помощью memcache, чтоб можно было передавать идентификатор и картинка была в кэше. В сам метод - передавать массив с настройками к memcache и идентификатор.
2) Передавать так же идентификатор и вторым необязательным параметром, по умолчанию например=tmp/ директорию к временным файлам, т.е. чтоб временное хранилище было в файлах и третьим аргументом передавать файл за какой период искать, там же создавать файл с БД, хранить в нем идентификатор, время создания и адрес к временному файлу, если файл старше нужного периода, то его удалять (если указано), если нет то с него вытаскивать значения, а не генерировать снова
Какие будут замечания, идеи или пожелания? А то если галерея будет приличная нагрузка без кэширования.
LifePlay
Отправлено: 14 Марта, 2011 - 10:18:41
Частый гость
Покинул форум
Сообщений всего: 135
Дата рег-ции: Авг. 2010 Откуда: Кобеляки, Украина
Помог: 0 раз(а)
Спасибо за класс. Буду разбираться.
Viper
Отправлено: 14 Марта, 2011 - 10:35:15
Активный участник
Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007 Откуда: Симферополь
Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008 Откуда: Крым
Помог: 11 раз(а)
Viper
класс неплохой, но у меня немного другие задачи были при написании своего.
Со временем подумаю над расширением функционала, например до изменения формата изображения на выходе.
EuGen
Отправлено: 14 Марта, 2011 - 10:48:41
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Понимаю, что критиковать много легче, чем создавать что-либо, но все же укажу на ряд ошибок, которые, на мой взгляд, могут быть важными:
0. Стоит использовать __construct и __destruct (конструктор и деструктор), так как это облегчает восприятие и понимание процессов внутри класса
1. Названия методов очень неочевидны и зачастую перекликаются одно с другим. fsave и save и т.п.
2. Названия методов и свойств очень желательно стилизовать единообразно. То есть, например, fsave и load_img одновременно - может вызвать трудности, каждый раз придется вспоминать, как же назван тот или иной метод (f_save? или же loadimg .. или ... кхм, пойду, посмотрю класс)
3. Уверен, некоторые методы необходимы только для внутреннего использования, их нужно закрыть от внешнего пространства (при помощи protected или даже private).
4. Желательно анонсировать набор методов и свойств, предоставляемых классом, при помощи соответствующего интерфейса. (хоть это и опционально)
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
ALEN
Отправлено: 14 Марта, 2011 - 10:56:08
Участник
Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008 Откуда: Крым
Помог: 11 раз(а)
0) Например, что туда в данный момент предлагаешь поместить?
__destruct - еще понятно, а вот для __construct - пока работы не нашел, а писать, чтоб було не очень хочется.
1) Тут проблема не в имени метода, а как уже говорилось - в области видимости.
2) смотри пункт 1
3) туда же в 1 , да и уже вроде все ясно стало
4) ну нужно и интерфейсы и ошибки ловить, не все сразу))) Я то все делаю по мере свободного времени и поставленных задач.
EuGen
Отправлено: 14 Марта, 2011 - 11:00:48
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Не понял, как область видимости соотносится с именем метода. Имена мы задаем сами, при этом желательно следовать единообразному правилу (а для имен переменных/свойств класса хорошим решением будет еще и указание типа переменной в имени, т.к. php слаботипизарованный язык - например, iCount, rgProperties и т.п.). Области видимости же мы задаем явно, с помощью public/protected/private
Или я просто чего-то не понял? Гм, мне к примеру не очевидно из имени "fsave" или скажем "text" какой это метод. Я вижу только что он объявлен без указания области видимости, то есть по-умолчанию - public.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.