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
Форумы портала PHP.SU :: Версия для печати :: Выручайте, необходимо дописать чуть чуть
Форумы портала PHP.SU » PHP » Напишите за меня, пожалуйста » Выручайте, необходимо дописать чуть чуть

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

1. Gerbyss - 04 Февраля, 2020 - 13:00:32 - перейти к сообщению
Есть такой замечательный класс, не сложный

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, поменять размеры и сохранить...

Хелп. Растерялся
2. Строитель - 04 Февраля, 2020 - 19:10:55 - перейти к сообщению
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. }


Можно и наследованием обойтись, даже не знаю, что было бы лучше.
3. LIME - 05 Февраля, 2020 - 14:17:57 - перейти к сообщению
Строитель нет наследование не лучше
лучше композиция это правильно
только реализация очень сумбурная
к этому подтолкнула видимо не лучшая реализация у тс, эдакий ActiveRecord, который умеет сам себя и получать и сохранять и доменную логику делать
отсюда и ломка мозга с непривычки
лучше сделать отдельно интерфейс репозитория(получить, сохранить) с двумя реализицями (файл, урл)
и фабрику которая вернет нужный репозиторий по некоему признаку(например разбор строки даденной, урл это или файл решит)
и потом работать с репозиторием и с полученным им объектом имаги
только не надо в репе сохранять объект, максимум строку адреса(урл, файл)
всего два метода: получить объект по строке, и сохранить переданный объект по переданной строке
не идеал, но пойдет
всеже сильно получше
4. Строитель - 05 Февраля, 2020 - 22:29:18 - перейти к сообщению
LIME пишет:
лучше сделать отдельно интерфейс репозитория(получить, сохранить) с двумя реализицями (файл, урл)
и фабрику которая вернет нужный репозиторий по некоему признаку(например разбор строки даденной, урл это или файл решит)
и потом работать с репозиторием и с полученным им объектом имаги
только не надо в репе сохранять объект, максимум строку адреса(урл, файл)
всего два метода: получить объект по строке, и сохранить переданный объект по переданной строке
Чё-то не получилось. Просидел часок-другой, и понял, что или ты не всё перечислил (например предположил, что я сам догадаюсь), или я не правильно понял суть твоей мысли.

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

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


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


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


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


Вроде всё логично. Но как теперь правильно работать с основным классом SimpleImage? Где его надо создавать, в фабрике? Или на клиентской стороне? Это далеко не все вопросы Радость ))
5. LIME - 06 Февраля, 2020 - 10:31:34 - перейти к сообщению
Строитель пишет:
например предположил, что я сам догадаюсь
да... не все тебе очевидное очевидно собеседнику
вот пример как если бы тип ресурса указывался в пользовательской форме(а может в конфиге, или настройкой в админке, или днем недели)
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 (добавление нового источника делается добавлением нового репа и парой строк в фабрике)
(Добавление)
Строитель пишет:
Где его надо создавать
в репозитории
ответственность репозитория это получение и сохранение - персистентность короче
и больше ничего
(Добавление)
это получается Стратегия
если нам надо получать из разных источников, но сохранять всегда в один, можем загрузчик(разные реализации интерфейса загрузчика) внедрять в конструктор репозитория(тогда он будет один до времени пока нам не понадобится бОльшая детализация) и делегировать загрузку ему
масса вариантов
6. Строитель - 08 Февраля, 2020 - 21:07:06 - перейти к сообщению
LIME, вот что у меня получилось:

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


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


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


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


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


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


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

Вообще, мне сложно не вмешиваясь в код класса SimpleImage написать его расширение, не используя наследование.

 

Powered by ExBB FM 1.0 RC1