Этот пакет может оптимизировать PNG, JPG, WEBP, AVIF, SVG и GIF, пропуская их через цепочку различных инструментов оптимизации изображений. Вот как вы можете его использовать:
используйте SpatieImageOptimizerOptimizerChainFactory;$optimizerChain = OptimizerChainFactory::create();$optimizerChain->optimize($pathToImage);
Изображение в $pathToImage
будет перезаписано оптимизированной версией, которая должна быть меньшего размера. Пакет автоматически определит, какие двоичные файлы оптимизации установлены в вашей системе, и будет использовать их.
Вот несколько примеров преобразований, выполненных этим пакетом.
Любишь Ларавель? Затем перейдите к конкретной интеграции Laravel.
Используете WordPress? Затем попробуйте команду WP CLI.
Энтузиаст SilverStripe? Не теряйте времени, зайдите в модуль SilverStripe.
Мы вкладываем много ресурсов в создание лучших в своем классе пакетов с открытым исходным кодом. Вы можете поддержать нас, купив один из наших платных продуктов.
Мы очень признательны вам за отправку нам открытки из вашего родного города с указанием того, какой из наших пакетов вы используете. Наш адрес вы найдете на странице контактов. Все полученные открытки мы публикуем на нашей виртуальной стене открыток.
Вы можете установить пакет через композитор:
композитору требуется spatie/image-Optimizer
Пакет будет использовать эти оптимизаторы, если они присутствуют в вашей системе:
JpegOptim
Выбор
PNGквант 2
СВГО 1
Гифсикл
cwebp
авифенк
Вот как установить все оптимизаторы в Ubuntu/Debian:
sudo apt-get установить jpegoptim sudo apt-get установить optipng sudo apt-get установить pngquant sudo npm install -g svgo sudo apt-get установить gifsicle sudo apt-get установить webp sudo apt-get install libavif-bin # минимум 0.9.3
А вот как установить двоичные файлы на MacOS (с помощью Homebrew):
заварить установку jpegoptim опция установки заваривания заварить установку pngquant npm установить -g svgo заварить установку gifsicle заварить установку WebP заварить установку libavif
Вот как установить двоичные файлы в Fedora/RHEL/CentOS:
sudo dnf установить epel-release sudo dnf установить jpegoptim sudo dnf установка optipng sudo dnf установить pngquant sudo npm install -g svgo sudo dnf установить gifsicle sudo dnf установить libwebp-tools sudo dnf установить libavif-tools
Пакет автоматически решит, какие инструменты использовать для конкретного изображения.
Файлы JPG будут уменьшены при запуске их через JpegOptim. Эти варианты используются:
-m85
: сохранит изображение с качеством 85%. Похоже, этот параметр соответствует правилам сжатия Pagespeed Google.
--strip-all
: удаляет всю текстовую информацию, такую как комментарии и данные EXIF.
--all-progressive
: это гарантирует, что полученное изображение будет прогрессивным, то есть его можно будет загрузить с использованием нескольких проходов с постепенно увеличивающейся детализацией.
PNG можно уменьшить, пропустив их с помощью двух инструментов. Первый — Pngquant 2, компрессор PNG с потерями. Никаких дополнительных опций мы не задаем, используются значения по умолчанию. После этого прогоняем образ через второй: Optipng. Эти варианты используются:
-i0
: это приведет к получению изображения с прогрессивной разверткой без чересстрочной развертки.
-o2
: устанавливает уровень оптимизации на два (несколько испытаний сжатия IDAT)
SVG будут минимизированы с помощью SVGO. Будет использоваться конфигурация SVGO по умолчанию, без плагинов cleanupIDs
и removeViewBox
поскольку они, как известно, вызывают проблемы при отображении нескольких оптимизированных SVG-файлов на одной странице.
Имейте в виду, что SVGO может сломать ваш SVG. Дополнительную информацию об этом вы найдете в замечательном блоге Сары Суэйдан.
GIF-файлы будут оптимизированы с помощью Gifsicle. Будут использованы следующие варианты:
-O3
: устанавливает максимальный уровень оптимизации Gifsicle, что дает самые медленные, но лучшие результаты.
WEBP будет оптимизирован Cwebp. Будут использованы следующие варианты:
-m 6
для самого медленного метода сжатия, чтобы получить лучшее сжатие.
-pass 10
для максимального увеличения количества проходов анализа.
-mt
многопоточность для некоторого повышения скорости.
-q 90
Фактор качества, приносящий наименее заметные изменения.
(Настройки оригинальные взяты отсюда)
AVIF будут оптимизированы с помощью avifenc. Будут использованы следующие варианты:
-a cq-level=23
: постоянный уровень качества. Более низкие значения означают лучшее качество и больший размер файла (0–63).
-j all
: количество заданий (рабочие потоки, all
используют все доступные ядра).
--min 0
: Минимальный квантователь цвета (0–63).
--max 63
: Максимальный квантователь цвета (0–63).
--minalpha 0
: Минимальный квантователь для альфа (0-63).
--maxalpha 63
: Максимальный квантователь для альфа (0-63).
-a end-usage=q
Режим управления скоростью установлен на режим постоянного качества.
-a tune=ssim
: SSIM для настройки кодера на метрику искажений.
(Настройки оригинальные взяты отсюда и отсюда)
Это способ использования пакета по умолчанию:
используйте SpatieImageOptimizerOptimizerChainFactory;$optimizerChain = OptimizerChainFactory::create();$optimizerChain->optimize($pathToImage);
Изображение в $pathToImage
будет перезаписано оптимизированной версией, которая должна быть меньшего размера.
Пакет автоматически определит, какие двоичные файлы оптимизации установлены в вашей системе, и будет использовать их.
Чтобы сохранить исходное изображение, вы можете передать второй optimize
:
используйте SpatieImageOptimizerOptimizerChainFactory;$optimizerChain = OptimizerChainFactory::create();$optimizerChain->optimize($pathToImage, $pathToOutput);
В этом примере пакет не будет трогать $pathToImage
и записывать оптимизированную версию в $pathToOutput
.
Вы можете установить максимальное время в секундах, которое может использовать каждый отдельный оптимизатор в цепочке, вызвав setTimeout
:
$optimizerChain->setTimeout(10) ->оптимизировать($pathToImage);
В этом примере каждому оптимизатору в цепочке будет предоставлено максимум 10 секунд на выполнение своей работы.
Если вы хотите настроить цепочку оптимизаторов, вы можете сделать это, добавив Optimizer
вручную в OptimizerChain
.
Вот пример, в котором мы хотим использовать только optipng
и jpegoptim
:
используйте SpatieImageOptimizerOptimizerChain; используйте SpatieImageOptimizerOptimizersJpegoptim; используйте SpatieImageOptimizerOptimizersPngquant; $optimizerChain = (новый OptimizerChain) ->addOptimizer(new Jpegoptim([ '--strip-all', '--all-progressive', ])) ->addOptimizer(new Pngquant([ '--force', ]))
Обратите внимание, что вы можете передать параметры, которые Optimizer
должен использовать, своему конструктору.
Хотите использовать другую утилиту командной строки для оптимизации изображений? Без проблем. Просто напишите свой собственный оптимизатор. Оптимизатором является любой класс, реализующий интерфейс SpatieImageOptimizerOptimizersOptimizer
:
пространство имен SpatieImageOptimizerOptimizers; используйте SpatieImageOptimizerImage; оптимизатор интерфейса {/** * Возвращает имя двоичного файла, который будет выполнен. * * @return string */public functionbinaryName(): string;/** * Определяет, может ли данное изображение быть обработано оптимизатором. * * @param SpatieImageOptimizerImage $image * * @return bool */public function canHandle(Image $image): bool;/** * Задайте путь к изображению, которое необходимо оптимизировать. * * @param string $imagePath * * @return $this */public function setImagePath(string $imagePath);/** * Установите параметры, которые должен использовать оптимизатор. * * @param array $options * * @return $this */public function setOptions(array $options = []);/** * Получите команду, которую необходимо выполнить. * * @return string */public function getCommand(): string; }
Если вы хотите просмотреть пример реализации, взгляните на существующие оптимизаторы, поставляемые с этим пакетом.
Вы можете легко добавить свой оптимизатор, используя метод addOptimizer
в OptimizerChain
.
используйте SpatieImageOptimizerImageOptimizerFactory;$optimizerChain = OptimizerChainFactory::create();$optimizerChain ->addOptimizer(новый YourCustomOptimizer()) ->оптимизировать($pathToImage);
По умолчанию пакет не выдает никаких ошибок и просто работает молча. Чтобы проверить, что делает пакет, вы можете установить регистратор:
используйте SpatieImageOptimizerOptimizerChainFactory;$optimizerChain = OptimizerChainFactory::create();$optimizerChain ->useLogger(новый MyLogger()) ->оптимизировать($pathToImage);
Регистратор — это класс, реализующий PsrLogLoggerInterface
. Хорошая, полностью совместимая библиотека журналирования — Monolog. Пакет будет записывать в журнал, какие Optimizers
используются, какие команды выполняются и их выходные данные.
Вот несколько реальных примеров преобразований, выполненных с помощью этого пакета.
Методология для изображений JPG, WEBP, AVIF: исходное изображение было загружено в spatie/image (с использованием драйвера GD по умолчанию) и изменено до ширины 2048 пикселей:
SpatieImageImage::load('original.jpg') ->ширина(2048) ->save('image.jpg'); // изображение.png, изображение.webp, изображение.avif
Оригинал
771 КБ
Оптимизированный
511 КБ (-33,7%, DSSIM: 0,00052061)
кредиты: Джефф Шелдон, через Unsplash
Оригинал
461 КБ
Оптимизированный
184 КБ (-60,0%, DSSIM: 0,00166036)
кредиты: Джефф Шелдон, через Unsplash
Оригинал
725 КБ
Оптимизированный
194 КБ (-73,2%, DSSIM: 0,00163751)
кредиты: Джефф Шелдон, через Unsplash
Оригинал: Photoshop «Сохранить для Интернета» | PNG-24 с прозрачностью
39 КБ
Оптимизированный
16 КБ (-59%, DSSIM: 0,00000251)
Оригинал: Иллюстратор | Веб-оптимизированный экспорт SVG
25 КБ
Оптимизированный
20 КБ (-21,5%)
Пожалуйста, посетите CHANGELOG для получения дополнительной информации о том, что изменилось за последнее время.
композиторский тест
Пожалуйста, смотрите ВКЛАД для получения подробной информации.
Если вы обнаружили ошибку, связанную с безопасностью, отправьте электронное письмо по адресу [email protected] вместо использования системы отслеживания проблем.
Вы можете свободно использовать этот пакет (он имеет лицензию MIT), но если он попадет в вашу производственную среду, мы будем очень признательны, если вы пришлете нам открытку из вашего родного города с указанием того, какой из наших пакетов вы используете.
Наш адрес: Spatie, Kruikstraat 22, 2018, Антверпен, Бельгия.
Все полученные открытки мы публикуем на сайте нашей компании.
Фрик Ван дер Хертен
Все участники
Этот пакет создан на основе psliwa/image-optimizer.
Эмоциональная поддержка от Joke Forment
Лицензия MIT (MIT). Дополнительную информацию см. в файле лицензии.