• Stars
    star
    319
  • Rank 131,081 (Top 3 %)
  • Language
    PHP
  • License
    MIT License
  • Created over 13 years ago
  • Updated about 2 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Image manipulation using Imagine and Twig Filters

Deprecated

This project is no longer actively maintained, please find one of the populate forks. Thanks!

AvalancheImagineBundle

This bundle provides easy image manipulation support for Symfony2. For example, with this bundle, the following is possible:

<img src="{{ '/relative/path/to/image.jpg' | apply_filter('thumbnail') }}" />

This will perform the transformation called thumbnail, which you can define to do a number of different things, such as resizing, cropping, drawing, masking, etc.

This bundle integrates the standalone PHP "Imagine library".

Installation

Installation is a quick 3 step process:

  1. Download AvalancheImagineBundle using composer
  2. Enable the Bundle
  3. Configure your application's config.yml

Step 1: Download AvalancheImagineBundle using composer

Add AvalancheImagineBundle in your composer.json:

composer require avalanche123/imagine-bundle

Composer will install the bundle to your project's vendor/avalanche123/imagine-bundle directory.

Step 2: Enable the bundle

Enable the bundle in the kernel:

<?php
// app/AppKernel.php

public function registerBundles()
{
    $bundles = array(
        // ...
        new Avalanche\Bundle\ImagineBundle\AvalancheImagineBundle(),
    );
}

Step3: Register the bundle's routes

Finally, add the following to your routing file:

# app/config/routing.yml

_imagine:
    resource: .
    type:     imagine

Congratulations! You're ready to rock your images!

Basic Usage

This bundle works by configuring a set of filters and then applying those filters to images inside a template. So, start by creating some sort of filter that you need to apply somewhere in your application. For example, suppose you want to thumbnail an image to a size of 120x90 pixels:

# app/config/config.yml

avalanche_imagine:
    filters:
        my_thumb:
            type:    thumbnail
            options: { size: [120, 90], mode: outbound }

You can also change the quality and the format you want to use to save our image :

# app/config/config.yml

avalanche_imagine:
    filters:
        my_thumb:
            type:    thumbnail
            options: { size: [120, 90], mode: outbound, quality: 100, format: png }

You've now defined a filter called my_thumb that performs a thumbnail transformation. We'll learn more about available transformations later, but for now, this new filter can be used immediately in a template:

<img src="{{ '/relative/path/to/image.jpg' | apply_filter('my_thumb') }}" />

Or if you're using PHP templates:

<img src="<?php $this['imagine']->filter('/relative/path/to/image.jpg', 'my_thumb') ?>" />

Behind the scenes, the bundle applies the filter(s) to the image on the first request and then caches the image to a similar path. On the next request, the cached image would be served directly from the file system.

In this example, the final rendered path would be something like /media/cache/my_thumb/relative/path/to/image.jpg. This is where Imagine would save the filtered image file.

HTTP Cache Headers

  • cache_type - one of the three values: false, public or private. Setting false disables caching i.e. sets Cache-Control: no-cache.

    default: false

  • cache_expires - Sets time when cache expires. Uses format that the DateTime parser understands. Expression will be prefixed with + so expression should be like 2 weeks. Used only when cache_type equal public or private.

    default: 1 day

Configuration example:

# app/config/config.yml

avalanche_imagine:
    filters:
        my_thumb:
            type:    thumbnail
            options: { size: [120, 90], mode: outbound, cache_type: public, cache_expires: 2 weeks }

Cache headers are set only for first request when image is generated. To solve this issue you should add additional configuration for your web server. Example for apache web server:

<IfModule mod_expires.c>
    <Directory "/path/to/web/media/cache">
        ExpiresActive On
        ExpiresDefault "access plus 2 weeks"
    </Directory>
</IfModule>

Configuration

The default configuration for the bundle looks like this:

avalanche_imagine:
    source_root:  %kernel.root_dir%/../web
    web_root:     %kernel.root_dir%/../web
    cache_prefix: media/cache
    driver:       gd
    filters:      []

There are several configuration options available:

  • source_root - can be set to the absolute path to your original image's directory. This option allows you to store the original image in a different location from the web root. Under this root the images will be looked for in the same relative path specified in the apply_filter template filter.

    default: %kernel.root_dir%/../web

  • web_root - must be the absolute path to you application's web root. This is used to determine where to put generated image files, so that apache will pick them up before handing the request to Symfony2 next time they are requested.

    default: %kernel.root_dir%/../web

  • cache_prefix - this is also used in the path for image generation, so as to not clutter your web root with cached images. For example by default, the images would be written to the web/media/cache/ directory.

    default: media/cache

  • driver - one of the three drivers: gd, imagick, gmagick

    default: gd

  • filters - specify the filters that you want to define and use

Each filter that you specify have the following options:

  • type - determine the type of filter to be used, refer to Filters section for more information
  • options - options that should be passed to the specific filter type
  • path - override the global cache_prefix and replace it with this path
  • source_root - override the global source_root and replace it with this path

Built-in Filters

Currently, this bundles comes with just one built-in filter: thumbnail.

Thumbnail

The thumbnail filter, as the name implies, performs a thumbnail transformation on your image. The configuration looks like this:

filters:
    my_thumb:
        type:    thumbnail
        options: { size: [120, 90], mode: outbound }

The mode can be either outbound or inset.

Resize

The resize filter may be used to simply change the width and height of an image irrespective of its proportions.

Consider the following configuration example, which defines two filters to alter an image to an exact screen resolution:

avalanche_imagine:
    filters:
        cga:
            type:    resize
            options: { size: [320, 200] }
        wuxga:
            type:    resize
            options: { size: [1920, 1200] }

RelativeResize

The relative_resize filter may be used to heighten, widen, increase or scale an image with respect to its existing dimensions. These options directly correspond to methods on Imagine's BoxInterface.

Given an input image sized 50x40 (width, height), consider the following annotated configuration examples:

avalanche_imagine:
    filters:
        heighten:
            type:    relative_resize
            options: { heighten: 60 } # Transforms 50x40 to 75x60
        widen:
            type:    relative_resize
            options: { widen: 32 }    # Transforms 50x40 to 40x32
        increase:
            type:    relative_resize
            options: { increase: 10 } # Transforms 50x40 to 60x50
        scale:
            type:    relative_resize
            options: { scale: 2.5 }   # Transforms 50x40 to 125x100

If you prefer using Imagine without a filter configuration, the RelativeResize class may be used directly.

Paste

The paste filter pastes an image into your image.

avalanche_imagine:
    filters:
        paste:
            type:        paste
            options:
                image:   %kernel.root_dir%/Resources/image.png  # path to image
                x:       right                                  # [left|right|center] or integer
                y:       bottom                                 # [top|bottom|middle] or integer

Chain

With chain filter you can apply some filters on your image. You can quite simply create a watermark filter:

avalanche_imagine:
    filters:
        watermark:
            type:                chain
            options:
                filters:
                    thumbnail:                                          # filter type
                        size:    [100, 100]                             # filter options
                        mode:    outbound
                    paste:
                        image:   %kernel.root_dir%/Resources/image.png
                        x:       right
                        y:       bottom

Crop

The crop filter crop an image with start coordinate, and size dimension.

avalanche_imagine:
    filters:
        crop:
            type   : crop
            options: { start: [0, 0], size: [100, 100] } #crop image with 100x100 square box

Load your Custom Filters

The ImagineBundle allows you to load your own custom filter classes. The only requirement is that each filter loader implement the following interface:

Avalanche\Bundle\ImagineBundle\Imagine\Filter\Loader\LoaderInterface

To tell the bundle about your new filter loader, register it in the service container and apply the following tag to it (example here in XML):

<tag name="imagine.filter.loader" filter="my_custom_filter" />

For more information on the service container, see the Symfony2 Service Container documentation.

You can now reference and use your custom filter when defining filters you'd like to apply in your configuration:

filters:
    my_special_filter:
        type:    my_custom_filter
        options: { }

For an example of a filter loader implementation, refer to Avalanche\Bundle\ImagineBundle\Imagine\Filter\Loader\ThumbnailFilterLoader.

Caveats

If you are generating your image names from multiple parts in a Twig template, please be aware that Twig applies filters before concatenation, so

<img src="{{ '/relative/path/to/' ~ some_variable ~ '.jpg' | apply_filter('my_thumb') }}" />

will apply your filter to '.jpg', and then concatenate the result to '/relative/path/to/' and some_variable. So the correct invocation would be

<img src="{{ ('/relative/path/to/' ~ some_variable ~ '.jpg') | apply_filter('my_thumb') }}" />

Using as a service

You can use ImagineBundle as a service and resolve the cached image path.

$avalancheService = $this->get('imagine.cache.path.resolver');

Then, call the getBrowserPath and pass the original image webpath and the filter you want to use

$cachedImage = $avalancheService->getBrowserPath($object->getWebPath(), 'my_thumb');

And also use ImagineBundle as a service and create the cache image from controller.

$cacheManager = $this->get('imagine.cache.manager');
$cachedPath = $cacheManager->cacheImage($this->getRequest()->getBaseUrl(), '/images/picture1.jpg', 'my_filter');

More Repositories

1

cassandra-web

A web interface for Apache Cassandra
JavaScript
135
star
2

symfony-docs-ru

Russian translation of Symfony2 documentations
82
star
3

doxphp

Dox for PHP, inspired by Dox for JavaScript
PHP
51
star
4

uvrb

Ruby bindings for libuv
Ruby
41
star
5

AvalancheSitemapBundle

SitemapBundle Reloaded
PHP
32
star
6

Transform

Object Transformation Library for PHP 5.3 In a need to map object data from one system to another, I was always using temporary, throw-away solutions, which turned out to be pretty ugly. PHP 5.3 Reflection API changes the game...
PHP
20
star
7

twilio-magento

This module integrates Twilio in Magento
PHP
15
star
8

node-console

a terminal in the browser
JavaScript
14
star
9

MicroKernelBundle

A micro kernel for Symfony 2, inspired by the Ruby Sinatra Web Framework
PHP
11
star
10

node-tinyurl

A tinyurl application implemented with NodeJS and MongoDB
JavaScript
8
star
11

ServerBundle

Symfony 2 HTTP webserver (PHP 5.3 only -- everything is HIGHLY EXPERIMENTAL -- things WILL change)
PHP
7
star
12

datastax-is-hiring

Come work with me on the most advanced clients for the most advanced distributed database
7
star
13

homebrew-rpmbuild

homebrew tap to provide rpmbuild formula
Ruby
7
star
14

nrperb

Execute nagios remote plugins from ruby
Ruby
5
star
15

inspector

a ruby validation library
Ruby
5
star
16

frank

an honest HTTP DSL for Ruby
Ruby
5
star
17

PHP-Stomp-Queue

A Stomp Protocol Queue adapter for Zend_Queue, more unit-tests, 'no-local' header, php 5.3 based
PHP
4
star
18

cli

Small Ruby command line tools library shared by various projects
Ruby
4
star
19

mastermind

The game of mastermind in Rails
Ruby
4
star
20

homebrew-juju

Central place for all the OSX Brew juju Tools
Ruby
2
star
21

data_structures

implementing various data structures
JavaScript
1
star
22

sinatra-rabbit

Rabbit is a Sinatra DSL extension for writing REST API's
Ruby
1
star
23

rdaux

RDaux creates beautiful documentation websites from markdown files
JavaScript
1
star
24

zeromqrb

Tiny wrapper around ffi-rzmq that raises errors
Ruby
1
star
25

uvmemcached

libuv memcached client and ruby bindings
C
1
star