techart / image-service
Provider to libraries for working with images
Requires
- php: ^8.2
- gumlet/php-image-resize: ^2.0
- illuminate/contracts: >=8
- illuminate/support: >=8
- intervention/image: ^2.7
Requires (Dev)
- ext-exif: *
- phpunit/phpunit: ^10
- symfony/var-dumper: ^7.0
README
Сервис представляет собой адаптер для обработки, сохранения, получения и удаления картинок.
Стандарнно имеет 2 менеджров по работе с изображениями:
InterventionImageManager
, работает с библиотекойintervention/image
поддерживает драйвераimagick
иgd
GumletImageResizeManager
, работает с библиотекойgumlet/php-image-resize
поддерживает толькоgd
драйвер
Менеджеры представляют собой класс адаптер к библиотекам, для написания собстевнного менеджера необходимо реализовать интерфейс ImageManagerContract
Так же есть 2 класса по работе с файловой системой StandardStorage
и LaravelStorage
(для проектов на laravel), при желании можно написать собственный, главное не забыть реализовать интерфейс StorageContract
Классы, реализующие StorageContract
, представляют собой управление файловой системой, что необходимо для создания директорий, получения пути до файла и т.д
Возможности
- Конвертировать изображения в разные форматы, зависит от выбранного менеджера.
- Изменять размер изображений, методы так же зависят от выбранного менеджера.
- Удалять созданные изображаения
Как использовать
Для использования необходимо выбрать класс менеджреа и класс по работе с файловой системой, задать конфигурационный массив и получить сущность класса ImageService.
Конфиг
Конфиг представляет собой массив, ограничевающий работу сервиса в рамках доуступных методов, размеров, качества и форматов изображений.
Может иметь следущие ключи: 'resize' | 'format' | 'method' | 'quality'
Ключ quality
явяется не обязательным
Ключ resize
моежт быть как массивом, содрежащим доступные размеры, например:
[
'200x200',
'200x0',
'0x200',
'1200x369'
]
А так же может быть строкой, со значением *
, что будет убирать ограничение на доступные размеры
Основные объекты для взаимодействия
Объект \Techart\ImageService\Service
Основной класс управления, предаставляющий доступ к объектам изменения изображения и работе с уже созданными картинками.
$manager = new \Techart\ImageService\Managers\InterventionImageManager(); $storage = \Techart\ImageService\Storages\StandardStorage::getInstance(); $config = [ 'sizes' => '*', 'format' => [ 'webp', 'jpg', 'jpeg', 'png', 'gif', ], 'methods' => [ 'resize', 'crop', 'fit', ] ]; $service = \Techart\ImageService\Service::getInstance($manager, $storage, $config);
Объект \Techart\ImageService\Storage
Представляет собой класс для получения и удаления созданых изображений.
Данный класс возвращает метод storage
объекта \Techart\ImageService\Service
. В метод необходимо передать оносительный путь оригинальной картинки
Класс имеет следующий набор методов
haveModifyImages
- возвращаетtrue
илиfalse
в зависимости от того, есть ли модифицированные копии оригинально изображенияgetOriginalImage
- возвращает массив, содержащий пути всех модифицированных копий оригинально изображенияdelete
- удаляет все модифицированные копии оригинально изображения, и само оригинальное изображение. Для того, что бы не удалить оригинальное изображение передайтеfalse
в качестве аргумента при вызове метода
Объект \Techart\ImageService\Processor
Представляет собой класс, реализующий манипуляции с изображениями, через него так же можно задавать параметры для манипуляций.
Данный класс возвращает метод modify
объекта \Techart\ImageService\Service
.
Выполнение манипуляций происходит после вызова метода process
, который вернет сущность класса \Techart\ImageService\Paths
, который предоставляет доступ к
информации, url и пути расположения оригинального и нового изображения.
Объект \Techart\ImageService\Paths
Возвращается в результате работы метода process
объекта \Techart\ImageService\Processor
.
Имеет следующий набор методов
getInfo
- возвращает массив с данными об изображении, имеет следующую структуру:
[
'dirname' => 'Директория картинки',
'basename' => 'Имя картинки вместе с раширением',
'extension' => 'Расширение картинки',
'filename' => 'Имя картинки',
'real_path' => 'Абсолютный путь картинки',
'path' => 'Относительный путь картинки',
'mime' => 'Расширение картинки в формате mime',
'url' => 'URL по которому картинка будет доступена',
'size' => [
'w' => Ширина картинки,
'h' => Высота картинки,
'string' => Строка вида width="{Ширина}" height="{Высота}",
],
]
getUrl
- возвращает URL по которому картинка будет доступенаgetPath
- возвращает абсолютный путь картинки
Так же существуют аналогичные методы для оригинального изображения, например, getOriginalUrl
Пример работы непосредственно с изображением
Пример работы:
Важно, путь до оригнальной картинки должен быть относительный
Модификация картинок
Пример работы, где параметры для обрабокти устанавливаются с помощью методов класса \Techart\ImageService\Processor
:
$imageUrl = $service->modify('путь до оригинальной картинки') ->setQuality(95) ->setSizes('800x600') ->setFormat('webp') ->setMethod('fit') ->process() ->getUrl()
Пример работы, где параметры для обрабокти передаются массивом с следущими ключами:
- resize - ресайз
- quality - качество
- format - формат
- method - метод, по умолчанию resize
$imageUrl = $service->modify('путь до оригинальной картинки', [ 'resize' => '400x0', 'format' => 'webp', 'quality' => 80, 'method' => 'fit' ])->process()->getUrl()
Пример работы, где параметры для обрабокти передаются строкой
- /r - ресайз
- /q - качество
- /f - формат
- /m - метод, по умолчанию resize(подходит в 90% случаев)
$imageUrl = $service->setup('путь до оригинальной картинки', '/r/640x480/r/f/webp/f/q/80/q/m/fit/m') ->process() ->getUrl();
Удаление изображений
Не забудьте, при необходимости(удаление записи в бд, или обновления картинки и пр.), удалить изображения
Для этого есть объект \Techart\ImageService\Storage
и его метод delete()
, который удаляет все изображения связанные с оригиналом(включая оригинал).
Что бы не удалить оригинал передайте false
первым аргументом
Пример:
$originalImage = 'путь до оригинальной картинки'; $storage = $service->storage($originalImage); if ($storage->haveModifyImages()) { $storage->delete(false); }