How to Use Assetic For Image Optimization with Twig Functions
=============================================================
Amongst its many filters, Assetic has four filters which can be used for on-the-fly
image optimization. This allows you to get the benefits of smaller file sizes
without having to use an image editor to process each image. The results
are cached and can be dumped for production so there is no performance hit
for your end users.
Using Jpegoptim
---------------
`Jpegoptim`_ is a utility for optimizing JPEG files. To use it with assetic,
add the following to the assetic config:
.. configuration-block::
.. code-block:: yaml
# app/config/config.yml
assetic:
filters:
jpegoptim:
bin: path/to/jpegoptim
.. code-block:: xml
.. code-block:: php
// app/config/config.php
$container->loadFromExtension('assetic', array(
'filters' => array(
'jpegoptim' => array(
'bin' => 'path/to/jpegoptim',
),
),
));
.. note::
Notice that to use jpegoptim, you must have it already installed on your
system. The ``bin`` option points to the location of the compiled binary.
It can now be used from a template:
.. configuration-block::
.. code-block:: html+jinja
{% image '@AcmeFooBundle/Resources/public/images/example.jpg'
filter='jpegoptim' output='/images/example.jpg'
%}
{% endimage %}
.. code-block:: html+php
images(
array('@AcmeFooBundle/Resources/public/images/example.jpg'),
array('jpegoptim')) as $url): ?>
Removing all EXIF Data
~~~~~~~~~~~~~~~~~~~~~~
By default, running this filter only removes some of the meta information
stored in the file. Any EXIF data and comments are not removed, but you can
remove these by using the ``strip_all`` option:
.. configuration-block::
.. code-block:: yaml
# app/config/config.yml
assetic:
filters:
jpegoptim:
bin: path/to/jpegoptim
strip_all: true
.. code-block:: xml
.. code-block:: php
// app/config/config.php
$container->loadFromExtension('assetic', array(
'filters' => array(
'jpegoptim' => array(
'bin' => 'path/to/jpegoptim',
'strip_all' => 'true',
),
),
));
Lowering Maximum Quality
~~~~~~~~~~~~~~~~~~~~~~~~
The quality level of the JPEG is not affected by default. You can gain
further file size reductions by setting the max quality setting lower than
the current level of the images. This will of course be at the expense of
image quality:
.. configuration-block::
.. code-block:: yaml
# app/config/config.yml
assetic:
filters:
jpegoptim:
bin: path/to/jpegoptim
max: 70
.. code-block:: xml
.. code-block:: php
// app/config/config.php
$container->loadFromExtension('assetic', array(
'filters' => array(
'jpegoptim' => array(
'bin' => 'path/to/jpegoptim',
'max' => '70',
),
),
));
Shorter syntax: Twig Function
-----------------------------
If you're using Twig, it's possible to achieve all of this with a shorter
syntax by enabling and using a special Twig function. Start by adding the
following config:
.. configuration-block::
.. code-block:: yaml
# app/config/config.yml
assetic:
filters:
jpegoptim:
bin: path/to/jpegoptim
twig:
functions:
jpegoptim: ~
.. code-block:: xml
.. code-block:: php
// app/config/config.php
$container->loadFromExtension('assetic', array(
'filters' => array(
'jpegoptim' => array(
'bin' => 'path/to/jpegoptim',
),
),
'twig' => array(
'functions' => array('jpegoptim'),
),
),
));
The Twig template can now be changed to the following:
.. code-block:: html+jinja
You can specify the output directory in the config in the following way:
.. configuration-block::
.. code-block:: yaml
# app/config/config.yml
assetic:
filters:
jpegoptim:
bin: path/to/jpegoptim
twig:
functions:
jpegoptim: { output: images/*.jpg }
.. code-block:: xml
.. code-block:: 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'
),
),
),
));
.. _`Jpegoptim`: http://www.kokkonen.net/tjko/projects.html