Suite à l’inauguration du site de mon agence web à Mâcon (clementguillemain.fr), ce blog va être prochainement supprimé, je vous invite à sauvegarder les articles qui vous intéressent. Un nouveau blog, plus dans l’air du temps et très accès sur Symfony 2 verra également le jour. Suivez mon profil twitter @Sybio01 pour des news !

Tutoriel: créer des miniatures (thumbnails) de vos images dans un projet en Symfony

26 octobre 2010 par Sybio | Catégorie: Symfony | 2 commentaires

Nous allons voir comment créer des miniatures d’images, alias thumbnails, ainsi que réduire une image en général, sous Symfony, grâce à un plugin très pratique: sfThumbnailPlugin.

Créer des miniatures dans Symfony

I) Installation du plugin

Dans la console en ssh, installez le plugin via la commande:

php symfony plugin:install sfThumbnailPlugin

Puis nettoyez votre cache:

php symfony cc

Le plugin est normalement activé dans config/ProjectConfiguration.class.php, si ce n’est pas le cas, rajoutez-le à la main:

class ProjectConfiguration extends sfProjectConfiguration
{
  public function setup()
  {
    $this->enablePlugins('sfDoctrinePlugin');
    $this->enablePlugins('sfThumbnailPlugin');
    ...
  }
}

Votre plugin est prêt à être utilisé !

II) Faire un thumbnail d’une image contenue dans un des dossiers du projet

La classe sfThumbnail existe désormais dans votre projet, lorsque vous l’initiez elle prend comme paramètre la largeur et la hauteur en pixels du thumbnail voulu:

$thumbnail = new sfThumbnail(150,110);
Ensuite, il faut lui indiquer à partir de qu’elle image faire la miniature, donc le chemin pour atteindre cette image:
$thumbnail->loadFile("/home/clem/public/monsite/web/uploads/avatars/avatar3.jpg");
Enfin, il ne vous reste qu’à sauvegarder le thumbnail ! Sa méthode « save » prend en paramètre le répertoire où l’on doit enregistrer la miniature (avec son nom)  ainsi que le mime_type de l’image:
$thumbnail->save('/home/clem/public/monsite/web/uploads/avatars/thumbnails/avatar3.jpg', 'image/jpg');
Rien de difficile n’est-ce pas :p ?
Attention: mettez bien les bons droits au dossier où vous stockez vos miniatures !

III) Pour aller plus loin: faire une méthode automatisée de création de thumbnails de notre classe Avatar

Imaginons que nous avons une classe Avatar qui a comme attribut « name »: cet attribut contient le nom de l’image.

Nous voulons traiter a chaque enregistrement d’un avatar une miniature pour l’afficher sur le profil de nos membres par exemple, il va être pratique de créer une méthode qui créée ces thumbnails.

// lib/model/doctrine/avatar.class.php
class Avatar extends BaseAvatar
{
    public function makeThumbnail()
    {
    	$pathImgUp = sfConfig::get('app_upload_directory_avatar').$this->getName();

        // on récupère des infos sur l'image, notamment son mime_type
    	$info = getimagesize($pathImgUp);

    	$thumbnail = new sfThumbnail(100,70);

    	$thumbnail->loadFile($pathImgUp);

    	$thumbnail->save(sfConfig::get('app_upload_directory_avatar_thumbnail').$this->getName(), image_type_to_mime_type($info[2]));
    }
}
Vous pouvez constater qu’au lieu d’écrire le chemin en dur vers mes avatars et leurs miniatures, j’ai utilisé un sfConfig  pour pouvoir modifier à souhait ce dernier depuis mon fichier de configuration app.yml.
Ensuite vous pouvez voir que j’essaye d’obtenir des informations sur notre image grâce à getimagesize. La seule qui nous intéresse ici est le mime_type de l’image (3ème donnée de l’array), mais on peut facilement utiliser d’autres informations comme la largeur ou la hauteur: vous pourrez tester si votre image est déjà plus petite qu’une miniature, dans ce cas là autant ne pas en faire une !
Lorsque vous manipulerez un objet Avatar, vous pourrez créer sa miniature en toute simplicité:
// création de la miniature pour un avatar:
$avatar->makeThumbnail();

IV) Lire la documentation

Je vous ai montré globalement comment utiliser sfThumbnailPlugin, mais jetez un coup d’oeil dans la documentation du plugin: vous pouvez aussi gérer la qualité de sortie de votre miniature, faire des miniatures de pages d’un pdf, etc…

2 commentaires pour cet article:
Laissez votre commentaire: