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 :: Выручайте, необходимо дописать чуть чуть

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Gerbyss
Отправлено: 04 Февраля, 2020 - 13:00:32
Post Id


Новичок


Покинул форум
Сообщений всего: 1
Дата рег-ции: Февр. 2020  


Помог: 0 раз(а)




Есть такой замечательный класс, не сложный

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. /*
  3. * File: SimpleImage.php
  4. * Author: Simon Jarvis
  5. * Copyright: 2006 Simon Jarvis
  6. * Date: 08/11/06
  7. * Link: http://www.white-hat-web-design.co.uk/articles/php-image-resizing.php
  8. *
  9. * This program is free software; you can redistribute it and/or
  10. * modify it under the terms of the GNU General Public License
  11. * as published by the Free Software Foundation; either version 2
  12. * of the License, or (at your option) any later version.
  13. *
  14. * This program is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  17. * GNU General Public License for more details:
  18. * http://www.gnu.org/licenses/gpl.html
  19. *
  20. */
  21.  
  22. class SimpleImage {
  23.  
  24.    var $image;
  25.    var $image_type;
  26.  
  27.    function load($filename) {
  28.       $image_info = getimagesize($filename);
  29.       $this->image_type = $image_info[2];
  30.       if( $this->image_type == IMAGETYPE_JPEG ) {
  31.          $this->image = imagecreatefromjpeg($filename);
  32.       } elseif( $this->image_type == IMAGETYPE_GIF ) {
  33.          $this->image = imagecreatefromgif($filename);
  34.       } elseif( $this->image_type == IMAGETYPE_PNG ) {
  35.          $this->image = imagecreatefrompng($filename);
  36.       }
  37.    }
  38.    function save($filename, $image_type=IMAGETYPE_JPEG, $compression=75, $permissions=null) {
  39.       if( $image_type == IMAGETYPE_JPEG ) {
  40.          imagejpeg($this->image,$filename,$compression);
  41.       } elseif( $image_type == IMAGETYPE_GIF ) {
  42.          imagegif($this->image,$filename);
  43.       } elseif( $image_type == IMAGETYPE_PNG ) {
  44.          imagepng($this->image,$filename);
  45.       }
  46.       if( $permissions != null) {
  47.          chmod($filename,$permissions);
  48.       }
  49.    }
  50.    function output($image_type=IMAGETYPE_JPEG) {
  51.       if( $image_type == IMAGETYPE_JPEG ) {
  52.          imagejpeg($this->image);
  53.       } elseif( $image_type == IMAGETYPE_GIF ) {
  54.          imagegif($this->image);
  55.       } elseif( $image_type == IMAGETYPE_PNG ) {
  56.          imagepng($this->image);
  57.       }
  58.    }
  59.    function getWidth() {
  60.       return imagesx($this->image);
  61.    }
  62.    function getHeight() {
  63.       return imagesy($this->image);
  64.    }
  65.    function resizeToHeight($height) {
  66.       $ratio = $height / $this->getHeight();
  67.       $width = $this->getWidth() * $ratio;
  68.       $this->resize($width,$height);
  69.    }
  70.    function resizeToWidth($width) {
  71.       $ratio = $width / $this->getWidth();
  72.       $height = $this->getheight() * $ratio;
  73.       $this->resize($width,$height);
  74.    }
  75.    function scale($scale) {
  76.       $width = $this->getWidth() * $scale/100;
  77.       $height = $this->getheight() * $scale/100;
  78.       $this->resize($width,$height);
  79.    }
  80.    function resize($width,$height) {
  81.       $new_image = imagecreatetruecolor($width, $height);
  82.       imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight());
  83.       $this->image = $new_image;
  84.    }
  85. }
  86. ?>


PHP:
скопировать код в буфер обмена
  1. include(CLASSES.'SimpleImage.php');
  2. $image = new SimpleImage();
  3. $image->load(ROOT_DIR."/iconadd.png");
  4. $image->resize(80, 80);
  5. $image->save(UPLOADS."profile/fff.png");


Работает на ура, но. Хотелось бы, чтобы возможно было загрузить изображение по url. То есть по ссылке. Кто лучше понимает, что за правки необходимо сделать?

То есть, определить что указать url, затем загрузить по url, поменять размеры и сохранить...

Хелп. Растерялся
 
 Top
Строитель
Отправлено: 04 Февраля, 2020 - 19:10:55
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




Gerbyss пишет:
определить что указать url, затем загрузить по url, поменять размеры и сохранить
Для этого не обязательно редактировать исходный класс, можно написать ещё один класс, который будет зависеть от класса SimpleImage:
Спойлер (Отобразить)
А использовать его так:
PHP:
скопировать код в буфер обмена
  1. $url = 'https://png.pngtree.com/png-clipart/20190611/original/'.
  2.     'pngtree-financial-money-money-png-picture-png-image_2943547.jpg';
  3. $filename = UPLOADS . "profile/fff.png";
  4.  
  5. try {
  6.     $getImageFromURL = new GetImageFromURL($url, $filename);
  7.     $getImageFromURL->getContent()->load()->resize()->save();
  8. } catch (Exception $e) {
  9.     echo $e->getMessage();
  10. }


Можно и наследованием обойтись, даже не знаю, что было бы лучше.

(Отредактировано автором: 04 Февраля, 2020 - 19:29:30)

 
 Top
LIME
Отправлено: 05 Февраля, 2020 - 14:17:57
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




Строитель нет наследование не лучше
лучше композиция это правильно
только реализация очень сумбурная
к этому подтолкнула видимо не лучшая реализация у тс, эдакий ActiveRecord, который умеет сам себя и получать и сохранять и доменную логику делать
отсюда и ломка мозга с непривычки
лучше сделать отдельно интерфейс репозитория(получить, сохранить) с двумя реализицями (файл, урл)
и фабрику которая вернет нужный репозиторий по некоему признаку(например разбор строки даденной, урл это или файл решит)
и потом работать с репозиторием и с полученным им объектом имаги
только не надо в репе сохранять объект, максимум строку адреса(урл, файл)
всего два метода: получить объект по строке, и сохранить переданный объект по переданной строке
не идеал, но пойдет
всеже сильно получше
 
 Top
Строитель
Отправлено: 05 Февраля, 2020 - 22:29:18
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




LIME пишет:
лучше сделать отдельно интерфейс репозитория(получить, сохранить) с двумя реализицями (файл, урл)
и фабрику которая вернет нужный репозиторий по некоему признаку(например разбор строки даденной, урл это или файл решит)
и потом работать с репозиторием и с полученным им объектом имаги
только не надо в репе сохранять объект, максимум строку адреса(урл, файл)
всего два метода: получить объект по строке, и сохранить переданный объект по переданной строке
Чё-то не получилось. Просидел часок-другой, и понял, что или ты не всё перечислил (например предположил, что я сам догадаюсь), или я не правильно понял суть твоей мысли.

Есть желание разобрать пример?

Интерфейс:
Спойлер (Отобразить)


Реализация интерфейса в двух классах:
Спойлер (Отобразить)


Простая фабрика:
Спойлер (Отобразить)


Пользовательская часть:
Спойлер (Отобразить)


Вроде всё логично. Но как теперь правильно работать с основным классом SimpleImage? Где его надо создавать, в фабрике? Или на клиентской стороне? Это далеко не все вопросы Радость ))
 
 Top
LIME
Отправлено: 06 Февраля, 2020 - 10:31:34
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




Строитель пишет:
например предположил, что я сам догадаюсь
да... не все тебе очевидное очевидно собеседнику
вот пример как если бы тип ресурса указывался в пользовательской форме(а может в конфиге, или настройкой в админке, или днем недели)
PHP:
скопировать код в буфер обмена
  1. $repository = ImageRepositoryFactory::get($_GET['source_type']);
  2. $imageObject = $repository->load($_GET['source_string']);
  3. $imageObject->resize($x, $y)->colorate(Colors::RED);
  4. $repository->save($imageObject, $_GET['source_string']);

конечно много вариантов в зависимости от требований
главное мы отделили мух в репозитории, котлеты в доменный объект, а точка принятия решения о мухах у нас в фабрике(чтоб не раскидывать по клиентскому коду меняющиеся этажерки условий)
кругом SRP и есть только одна причина для изменения классов(логика не связана с хранением)
как бонус OCP (добавление нового источника делается добавлением нового репа и парой строк в фабрике)
(Добавление)
Строитель пишет:
Где его надо создавать
в репозитории
ответственность репозитория это получение и сохранение - персистентность короче
и больше ничего
(Добавление)
это получается Стратегия
если нам надо получать из разных источников, но сохранять всегда в один, можем загрузчик(разные реализации интерфейса загрузчика) внедрять в конструктор репозитория(тогда он будет один до времени пока нам не понадобится бОльшая детализация) и делегировать загрузку ему
масса вариантов
 
 Top
Строитель
Отправлено: 08 Февраля, 2020 - 21:07:06
Post Id



Участник


Покинул форум
Сообщений всего: 1580
Дата рег-ции: Февр. 2014  
Откуда: Украина


Помог: 73 раз(а)




LIME, вот что у меня получилось:

SimpleImage (исходник):
Спойлер (Отобразить)


Repository:
Спойлер (Отобразить)


File:
Спойлер (Отобразить)


Url:
Спойлер (Отобразить)


Factory:
Спойлер (Отобразить)


Использование:
Спойлер (Отобразить)


На данный момент есть существенный недостаток: в зависимости от источника (локальный или удалённый файл) нужно вручную менять имя аргумента в методе $imageObject->load() класса SimpleImage.

Вообще, мне сложно не вмешиваясь в код класса SimpleImage написать его расширение, не используя наследование.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Напишите за меня, пожалуйста »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB