Среди многочисленных фильтров Assetic есть 4 фильтра, которые могут оптимизировать изображения на лету. Это позволяет уменьшить размер файлов изображений без применение графических редакторов для каждого отдельного изображения. Результаты кешируются и могут быть сохранены для использования в production режиме без влияния на производительность для конечных пользователей.
Использование Jpegoptim
Jpegoptim - инструмент для оптимизации JPEG файлов. Перед использованием его в Assetic нужно убедиться в его наличии в системе.
Пример установки для Ubuntu:
$ sudo apt-get install jpegoptim
Далее нужно добавить в конфигурацию его расположение, используя bin параметр jpegoptim фильтра.
YAML
# app/config/config.yml
assetic:
filters:
jpegoptim:
bin: path/to/jpegoptimXML
<!-- app/config/config.xml -->
<assetic:config>
<assetic:filter
name="jpegoptim"
bin="path/to/jpegoptim" />
</assetic:config>PHP
// app/config/config.php
$container->loadFromExtension('assetic', array(
'filters' => array(
'jpegoptim' => array(
'bin' => 'path/to/jpegoptim',
),
),
));Теперь его можно использовать в шаблоне:
Twig
{% image '@AppBundle/Resources/public/images/example.jpg'
filter='jpegoptim' output='/images/example.jpg' %}
<img src="{{ asset_url }}" alt="Example"/>
{% endimage %}PHP
<?php foreach ($view['assetic']->image(
array('@AppBundle/Resources/public/images/example.jpg'),
array('jpegoptim')
) as $url): ?>
<img src="<?php echo $view->escape($url) ?>" alt="Example"/>
<?php endforeach ?>Удаление всех EXIF данных
По умолчанию jpegoptim фильтр удаляет лишь некоторые мета данные, сохраненные в изображении. Для удаления всех EXIF данных и комментарий нужно установить strip_all равным true:
YAML
# app/config/config.yml
assetic:
filters:
jpegoptim:
bin: path/to/jpegoptim
strip_all: trueXML
<!-- app/config/config.xml -->
<assetic:config>
<assetic:filter
name="jpegoptim"
bin="path/to/jpegoptim"
strip_all="true" />
</assetic:config>PHP
// app/config/config.php
$container->loadFromExtension('assetic', array(
'filters' => array(
'jpegoptim' => array(
'bin' => 'path/to/jpegoptim',
'strip_all' => 'true',
),
),
));Уменьшение максимального качества
По умолчанию jpegoptim фильтр не изменяет качество JPEG изображения. Использование параметра конфигурации max позволяет задать уровень качества (в процентах от 0 до 100). Уменьшение размера изображения происходит за счет качества:
YAML
# app/config/config.yml
assetic:
filters:
jpegoptim:
bin: path/to/jpegoptim
max: 70XML
<!-- app/config/config.xml -->
<assetic:config>
<assetic:filter
name="jpegoptim"
bin="path/to/jpegoptim"
max="70" />
</assetic:config>PHP
// app/config/config.php
$container->loadFromExtension('assetic', array(
'filters' => array(
'jpegoptim' => array(
'bin' => 'path/to/jpegoptim',
'max' => '70',
),
),
));Короткий синтаксис: фунции Twig
При использовании Twig можно сократить объем кода, используя специальные функции Twig. Для этого нужно добавить конфигурацию:
YAML
# app/config/config.yml
assetic:
filters:
jpegoptim:
bin: path/to/jpegoptim
twig:
functions:
jpegoptim: ~XML
<!-- app/config/config.xml -->
<assetic:config>
<assetic:filter
name="jpegoptim"
bin="path/to/jpegoptim" />
<assetic:twig>
<assetic:twig_function
name="jpegoptim" />
</assetic:twig>
</assetic:config>PHP
// app/config/config.php
$container->loadFromExtension('assetic', array(
'filters' => array(
'jpegoptim' => array(
'bin' => 'path/to/jpegoptim',
),
),
'twig' => array(
'functions' => array('jpegoptim'),
),
),
));Теперь можно сделать изменения в шаблоне:
<img src="{{ jpegoptim('@AppBundle/Resources/public/images/example.jpg') }}" alt="Example"/>Вы также можете указать выходной каталог для изображений в файле Assetic конфигурации:
YAML
# app/config/config.yml
assetic:
filters:
jpegoptim:
bin: path/to/jpegoptim
twig:
functions:
jpegoptim: { output: images/*.jpg }XML
<!-- app/config/config.xml -->
<assetic:config>
<assetic:filter
name="jpegoptim"
bin="path/to/jpegoptim" />
<assetic:twig>
<assetic:twig_function
name="jpegoptim"
output="images/*.jpg" />
</assetic:twig>
</assetic:config>PHP
// app/config/config.php
$container->loadFromExtension('assetic', array(
'filters' => array(
'jpegoptim' => array(
'bin' => 'path/to/jpegoptim',
),
),
'twig' => array(
'functions' => array(
  'jpegoptim' => array(
output => 'images/*.jpg'
),
),
),
));Использование Jpegtran
Jpegtran — это командная утилита пакета libjpeg Она позволяет проводить манипуляции с JPEG файлами, но самой полезной ее функцией является оптимизация.
Для Linux эта утилита обычно есть в пакетах:
$ sudo apt-get install libjpeg-progs
Исходный код для линуксов, а также версию для Windows можно скачать тут. Описание установки под Mac есть тут.
YAML
# app/config/config.yml
assetic:
filters:
jpegtran:
bin: path/to/jpegtran
copy: none #убирает все метаданные из исходного файла
optimize: true #оптимизирует изображение
progressive: true #изменяет формат на jpgTwig
{% image '@AppBundle/Resources/public/images/example.jpg'
filter='jpegtran' output='/images/example.jpg' %}
<img src="{{ asset_url }}" alt="Example"/>
{% endimage %}Использование OptiPNG
OptiPNG — свободная программа для уменьшения размера файлов в формате Portable Network Graphics путём их сжатия различными методами с игнорированием ненужных для данного изображения функций PNG, таких как полноцветность для чёрно‐белого изображения. Также программа преобразует файлы других форматов (BMP, GIF, PNM и TIFF) в оптимизированный PNG.
Пример установки для Ubuntu:
$ sudo apt-get install optipng
YAML
# app/config/config.yml
assetic:
filters:
optipng:
bin: path/to/optipng
level: 3 #уровень оптимизации (0-7), по умолчанию: 2Twig
{% image '@AppBundle/Resources/public/images/example.png'
filter='optipng' output='/images/example.png' %}
<img src="{{ asset_url }}" alt="Example"/>
{% endimage %}Использование PNGOUT
PNGOUT — бесплатный оптимизатор PNG-изображений, разработанный Кеном Сильверманом. Работает в режиме командной строки. Программа применяет к изображениям сжатие без потерь, то есть качество изображения после сжатия точно такое же как и до сжатия.
Пример установки на Ubuntu 14.04 Server.
YAML
# app/config/config.yml
assetic:
filters:
pngout:
bin: path/to/pngout
color: #0,2,3,4,6
filter: #0,1,2,3,4,5
strategy: #0(default),1,2,3,4
block_split_threshold: #Это значение используется специальный алгоритм сжатия, который использует PNGOUT. Значение по умолчанию, как правило, очень хорошоTwig
{% image '@AppBundle/Resources/public/images/example.png'
filter='pngout' output='/images/example.png' %}
<img src="{{ asset_url }}" alt="Example"/>
{% endimage %}Попробовать сжатие можно, перевключившись в prod окружение. Но прежде не забудьте очистить кеш и сделать дамп файлов:
$ php app/console cache:clear --env=prod --no-debug
$ php app/console assetic:dump --env=prod --no-debug
Не забудьте о сжатии JS/CSS файлов и проверке кода.