Comment redimensionner une image en PHP

Lorsque vous construisez une application web avec Laravel (ou tout autre framework basé sur PHP) où les utilisateurs téléchargeront des images, vous aurez probablement recours à une bibliothèque de code pour manipuler et traiter ces images. Avec les appareils photo des téléphones portables qui capturent des images plus grandes et de meilleure résolution, les images brutes qui sont téléchargées pourraient rapidement remplir l’espace disponible sur le disque dur et causer des problèmes de performance sur le site web.

Bien que PHP dispose de bibliothèques de traitement d’images comme GD et Imagick, celles-ci ne sont pas toujours faciles à utiliser. Il existe un certain nombre de bibliothèques tierces qui facilitent le traitement des images.

Dans cet article, nous utiliserons Spatie Image, une bibliothèque de traitement d’images PHP développée par Spatie, qui crée un certain nombre de bibliothèques à code source libre pour Laravel et PHP. Elle offre une interface facile à utiliser pour les manipulations d’images courantes comme le redimensionnement, le recadrage et l’ajout d’effets.

Installation et utilisation de base

L’installation se fait à l’aide d’une commande composer assez simple :

composer require Spatie Image

Vous pouvez ensuite utiliser la classe Image pour charger et manipuler des images.

use Spatie\Image\Image;

$image = Image::load('example.jpg)
  ->width(50)
  ->save();

saveAppeler save sans aucun paramètre écrasera le fichier existant. Pour enregistrer dans un nouveau fichier, il faut passer le chemin du nouveau fichier à la méthode save. Il est possible d’enregistrer dans un format de fichier différent en changeant l’extension.

use Spatie\Image\Image;

$image = Image::load('example.jpg)
  ->save('example.png');

Redimensionner une image en PHP

Spatie Image propose plusieurs façons de redimensionner une image.

Les fonctions width et height prennent les dimensions souhaitées en pixels comme paramètres et redimensionnent l’image en conséquence. L’image redimensionnée sera contenue dans les dimensions $width et $height données en respectant le rapport d’aspect d’origine.

Image::load('example.png')
    ->width(300)
    ->height(250)
    ->save();

La fonction resize agit comme un raccourci, permettant de définir la largeur et la hauteur à l’aide d’une seule méthode.

Image::load('example.png')
    ->resize(300, 250)
    ->save();

La fonction Fit te permet de redimensionner l’image à une largeur et une hauteur données, mais donne un peu plus de contrôle sur la façon dont l’image est redimensionnée.

  • Fit::Contain redimensionne l’image pour qu’elle tienne dans les limites de la largeur et de la hauteur sans la recadrer, la déformer ou modifier le rapport hauteur/largeur.
  • Fit::Max redimensionne l’image pour qu’elle tienne dans les limites de la largeur et de la hauteur sans la recadrer, la déformer ou modifier le rapport hauteur/largeur, et n’augmente pas la taille de l’image si elle est plus petite que la taille de sortie.
  • Fit::Fill redimensionne l’image pour qu’elle tienne dans les limites de la largeur et de la hauteur sans la recadrer ni la déformer, et remplit l’espace restant avec la couleur d’arrière-plan (définie à l’aide de la fonction background ). L’image résultante correspondra aux dimensions imposées.
  • Fit::Stretch étire l’image pour qu’elle corresponde exactement aux dimensions imposées. L’image résultante remplira les dimensions et ne conservera pas le rapport d’aspect de l’image d’entrée.
  • Fit::Crop redimensionne l’image pour qu’elle remplisse les limites de largeur et de hauteur et recadre les données excédentaires de l’image. L’image résultante correspondra aux contraintes de largeur et de hauteur sans déformer l’image.

En appelant la méthode crop, une partie de l’image sera recadrée aux dimensions $width et $height données (pixels). Le paramètre $cropMethod permet de spécifier quelle partie sera recadrée.

Les valeurs CropPositions suivantes sont disponibles dans l’énumération : TopLeft, Top, TopRight, Left, Center, Right, BottomLeft, Bottom, BottomRight.

Image::load('example.jpg')
    ->crop(250, 250, CropPosition::TopRight)
    ->save();

Manipulation de l’image

Spatie Image propose un certain nombre d’autres méthodes pour manipuler une image.

Pour régler la luminosité, le contraste et le gamma de l’image.

Image::load('example.jpg')
    ->brightness(-20)
    ->save();

Pour ajouter des effets tels que flou, pixellisation, niveaux de gris et sépia à l’image.

Image::load('example.jpg')
    ->blur(20)
    ->save();

Pour ajouter une autre image en filigrane sur l’image.

Image::load('example.jpg')
    ->watermark('watermark.png', AlignPosition::center)
    ->save();

Pour ajouter du texte à l’image.

Image::load('example.jpg')
    ->text('Hello!')
    ->save();

Bien sûr, il est possible de combiner toutes ces manipulations en un seul appel. Par exemple, pour créer une version petite de l’image en niveaux de gris, nous pourrions faire quelque chose comme ceci :

Image::load('example.jpg')
    ->resize(64, 64)
    ->greyscale()
    ->brighten(20)
    ->save();

Vous pouvez consulter la documentation ici pour plus de détails sur cette bibliothèque de code.