# Extending Imager X

In addition to the built-in functionality, you can extend Imager to make it even more powerful. You can add your own effects, optimizers, external storages PRO, and even transformers PRO.

# Effects

Custom effects can be added by listening for the EVENT_REGISTER_EFFECTS event:

Event::on(\spacecatninja\imagerx\ImagerX::class,
    \spacecatninja\imagerx\ImagerX::EVENT_REGISTER_EFFECTS,
    static function (\spacecatninja\imagerx\events\RegisterEffectsEvent $event) {
        $event->effects['myeffect'] = MyEffect::class;
    }
);

The registered class must implement the ImagerEffectsInterface, and can then be used in your templates like this:

{% set transform = craft.imagerx.transformImage(image, { width: 800 }, { effects: { myeffect: [0.6, 'rgb(210,89,222)'] } }) %}

Have a look at the built-in effects for more examples of how effects can manipulate the image.

# Optimizers

Custom optimizers can be added by listening for the EVENT_REGISTER_OPTIMIZERS event:

Event::on(\spacecatninja\imagerx\ImagerX::class,
    \spacecatninja\imagerx\ImagerX::EVENT_REGISTER_OPTIMIZERS,
    static function (\spacecatninja\imagerx\events\RegisterOptimizersEvent $event) {
        $event->optimizers['myoptimizer'] = MyOptimizer::class;
    }
);

The registered class must implement the ImagerOptimizeInterface, and can then be used in your config like this:

'optimizers' => ['myoptimizer'],
'optimizerConfig' => [
    'myoptimizer' => [
        'extensions' => ['jpg'],
        'path' => '/usr/local/bin/myoptimizer',
        'options' => '-t -n40',
    ],
],

Please note that you decide yourself which config parameters your optimizer needs, but you should always add an 'extensions' parameter as shown above.

Have a look at the built-in optimizers for more examples of what optimizers can do.

# External storages

Custom external storages can be added by listening for the EVENT_REGISTER_EXTERNAL_STORAGES event:

Event::on(\spacecatninja\imagerx\ImagerX::class,
    \spacecatninja\imagerx\ImagerX::EVENT_REGISTER_EXTERNAL_STORAGES,
    static function (\spacecatninja\imagerx\events\RegisterExternalStoragesEvent $event) {
        $event->storages['mystorage'] = MyExternalStorage::class;
    }
);

The registered class must implement the ImagerStorageInterface, and can then be used in your config like this:

'storages' => ['mystorage'],
'storageConfig' => [
    'mystorage' => [
        'accessKey' => 'KJA5GH8FDD3FR9T',
        'secretAccessKey' => 'awIoJA76e3baHGD94DaeF6',
        'region' => 'eu-west-1',
        'bucket' => 'mytransforms',
    ],
],

Please note that you decide yourself which config parameters your external storage needs.

Have a look at the built-in storages for more examples of how external storages work.

# Transformers

TIP

Transformers are the most complex thing you can extend Imager with, and is not for the faint hearted. 😮 If you still want to give it a go, make sure you have a look at the existing transformers and get an understanding of the overall flow.

Custom transformers can be added by listening for the EVENT_REGISTER_TRANSFORMERS event:

Event::on(\spacecatninja\imagerx\ImagerX::class,
    \spacecatninja\imagerx\ImagerX::EVENT_REGISTER_TRANSFORMERS,
    static function (\spacecatninja\imagerx\events\RegisterTransformersEvent $event) {
        $event->transformers['mytransformer'] = MyTransformer::class;
    }
);

The registered class must implement the TransformerInterface, and can then be used in your config like this:

'transformer' => 'mytransformer',

The transformer should return a model representing the transformed image which implements TransformedImageInterface. Some properties may not be applicable for all kinds of transformers, but the model should handle this gracefully (ie, return empty values that the template code can check for).