Manipuler des images en PHP avec GD

Internet serait assez terne sans images. Cependant, maintenir et manipuler des centaines ou des milliers d'images pour votre site Web peut être un casse-tête. À mesure que la conception de votre site change, vous devrez peut-être modifier toutes vos images. Par exemple, vous devrez peut-être convertir toutes vos images en niveaux de gris ou les redimensionner à 50% de leur taille originale. Vous pouvez également vouloir compresser ou rogner différentes images. Cette opération manuelle prend du temps et génère des erreurs, mais avec un peu de connaissances en programmation, elle peut être automatisée..

Dans ce tutoriel, vous découvrirez la bibliothèque GD (Graphic Draw) en PHP. Vous verrez comment cette bibliothèque peut être utilisée pour manipuler des images en les redimensionnant, en les recadrant, en les tournant ou en les filtrant..

Qu'est-ce que GD??

PHP peut faire beaucoup plus que simplement servir du code HTML aux visiteurs. Par exemple, il a la capacité de manipuler des images. De plus, vous pouvez également créer vos propres images à partir de rien, puis les enregistrer ou les transmettre aux utilisateurs..

PHP peut gérer presque tous vos besoins de base en matière de manipulation d'images à l'aide de la bibliothèque GD - abréviation de Graphic Draw. 

Installer

Si vous travaillez sous Windows, vous pouvez inclure le php_gd2.dll déposer comme une extension dans php.ini. Si vous utilisez quelque chose comme XAMPP, vous trouverez le php_gd2.dll fichier dans le répertoire xampp \ php \ ext. Vous pouvez également vérifier si GD est installé sur votre système en utilisant la fonction phpinfo ();. Si vous faites défiler la sortie résultante, vous trouverez quelque chose de similaire au suivant.

Vous pouvez également consulter les pages de configuration requise et d'installation pour en savoir plus sur le processus d'installation..

Créer des images avec PHP GD

La première étape vers la manipulation d'images à l'aide de PHP est de les charger en mémoire en tant que ressource image. Ceci peut être réalisé en utilisant différentes fonctions pour différents formats. Toutes ces fonctions ont des noms très similaires et sont donc faciles à retenir.

Créer une nouvelle image

le imagecreatetruecolor () Cette fonction s'avérera utile si vous ne souhaitez pas manipuler une source d'image originale. Il accepte deux paramètres entiers: une largeur et une hauteur. Il retournera une ressource image si tout s'est passé comme prévu. La ressource image renvoyée est essentiellement une image noire avec une largeur et une hauteur spécifiées..

Charger un fichier image

Si vous envisagez de manipuler des images déjà stockées quelque part, vous pourrez utiliser des fonctions telles que imagecreatefromjpeg (), imagecreatefrompng (), et imagecreatefromgif (). Ceux-ci créeront une ressource image avec toutes les données du fichier image chargé. Ces fonctions acceptent un paramètre unique qui spécifie l'emplacement de l'image que vous chargez sous forme d'URL ou de chemin de fichier..

Créer une image à partir d'une chaîne

La bibliothèque GD vous permet également de créer des images à partir d’une chaîne en utilisant le imagecreatefromstring () fonction en PHP. Rappelez-vous que vous devrez utiliser base64_decode () sur la chaîne donnée avant imagecreatefromstring (). La fonction peut détecter automatiquement si le type d'image est JPG, PNG, GIF ou un autre format pris en charge..

Faire pivoter, redimensionner, recadrer et retourner une image

Certaines opérations courantes que vous pouvez effectuer sur une ressource image sont la rotation, la mise à l'échelle, le recadrage et le retournement..

Rotation

Vous pouvez faire pivoter une image que vous avez déjà chargée dans le script à l'aide du bouton imagerotate () une fonction. Il fera pivoter l'image à l'angle fourni en utilisant le centre de l'image comme centre de rotation. L'angle est fourni sous forme de valeur flottante et PHP considère qu'il s'agit du degré de rotation. 

Parfois, l'image pivotée aura des dimensions différentes de celles de la version d'origine. Cela signifie que vous vous retrouverez avec une zone non couverte après la rotation. Le troisième paramètre de la imagerotate () fonction peut être utilisée pour spécifier la couleur de fond de la zone vide après rotation.

Mise à l'échelle

Il est très facile de redimensionner une image à l'aide de la bibliothèque GD. Il vous suffit de passer la ressource image ainsi que la largeur et la hauteur au imagescale () une fonction. Si vous omettez la hauteur, GD redimensionnera l'image à la largeur spécifiée tout en préservant les proportions.. 

Vous pouvez également spécifier le mode de redimensionnement de l'image. Il peut être réglé sur IMG_NEAREST_NEIGHBOUR, IMG_BILINEAR_FIXED, IMG_BICUBIC, etc. Il est important de vous rappeler que cette fonction renvoie une nouvelle source d'image redimensionnée au lieu de modifier celle d'origine..

Recadrage

Vous pouvez rogner n’importe quelle ressource image en utilisant le imagecrop () fonction dans GD. Le premier paramètre est la ressource image d'origine et le second paramètre est un tableau associatif avec les clés X, y, largeur, et la taille, spécifier la position et les dimensions de la fenêtre de recadrage.

L'image du papillon ci-dessus a été recadrée à l'aide du code suivant:

$ im_php = imagecreatefromjpeg ('chemin / vers / image'); $ size = min (imagesx ($ im_php), imagesy ($ im_php)); $ im_php = imagecrop ($ im_php, ['x' => $ size * 0.4, 'y' => 0, 'width' => $ size, 'height' => $ size]); $ im_php = imagescale ($ im_php, 300);

Fondamentalement, nous stockons la longueur du plus petit côté dans le taille de $ variable. Cette variable est ensuite utilisée pour définir les limites de notre rectangle de découpage. Enfin, l'image est réduite de manière à ne faire que 300 pixels de large et de long. Cela nous donne une image carrée correctement dimensionnée.

Retourner des images

Les images peuvent être retournées horizontalement, verticalement ou dans les deux sens à l’aide des touches imageflip () une fonction. Il accepte la ressource image que vous voulez retourner comme premier paramètre et le mode de retournement comme second paramètre. Le mode Flip peut être réglé sur IMG_FLIP_HORIZONTAL, IMG_FLIP_VERTICAL, ou IMG_FLIP_BOTH.

L'image en haut à gauche dans la figure ci-dessus est l'original. L’image en haut à droite a été créée avec IMG_FLIP_HORIZONTAL, l'image en bas à gauche a été créée avec IMG_FLIP_VERTICAL, et l'image en bas à droite a été créée à l'aide de IMG_FLIP_BOTH. (L'image du corbeau provient de Pixabay.)

Appliquer des filtres à une image

GD a également une très utile filtre d'image () fonction qui peut appliquer des filtres sur différentes ressources d’image chargées à l’aide des fonctions des images précédentes. Cette fonction peut accepter différents paramètres en fonction du filtre que vous appliquez..

Pour commencer, spécifiez la ressource image et le nom du filtre que vous souhaitez appliquer. Vous pouvez le définir sur l’un des 12 types de filtres prédéfinis mentionnés dans la documentation.. 

  • IMG_FILTER_NEGATE: inverse les couleurs de l'image
  • IMG_FILTER_GRAYSCALE: supprime la couleur de l'image
  • IMG_FILTER_BRIGHTNESS: rend l'image plus claire ou plus sombre
  • IMG_FILTER_CONTRAST: augmente le contraste de l'image 
  • IMG_FILTER_COLORIZE: teinte l'image dans une couleur sélectionnée
  • IMG_FILTER_EDGEDETECT: met en évidence les bords de l'image
  • IMG_FILTER_EMBOSS: similaire à la détection de bord, mais donne à chaque bord un aspect en relief
  • IMG_FILTER_GAUSSIAN_BLUR: brouille l'image en utilisant la méthode gaussienne
  • IMG_FILTER_SELECTIVE_BLUR: brouille l'image en utilisant la méthode sélective
  • IMG_FILTER_MEAN_REMOVAL: un effet pour créer une image stylisée
  • IMG_FILTER_SMOOTH: adoucit les bords irréguliers de l'image
  • IMG_FILTER_PIXELATE: donne un aspect pixelisé à l'image 

Certains filtres aiment NIER, GRAYSCALE, DÉTECTER BORD et GAUFRER pas besoin de données supplémentaires. D'autres filtres, comme LUMINOSITÉ, CONTRASTE et LISSE, peut accepter un paramètre supplémentaire qui spécifie la quantité de luminosité, de contraste ou de lissage de l'image finale. le PIXELATE paramètre vous permet de spécifier deux paramètres supplémentaires: la taille du bloc ainsi que le mode de pixellisation. Finalement, le COLORISER le filtre accepte quatre paramètres qui déterminent les valeurs des composants rouge, vert et bleu ainsi que du canal alpha.

L'image en haut à gauche est l'original. L’image en haut à droite a été créée en utilisant le COLORISER filtre, le coin inférieur gauche a été créé à l'aide du GRAYSCALE filtre, et l'image en bas à droite a été créée à l'aide du bouton LUMINOSITÉ filtre. (Cette image de papillon a été trouvée à Pixabay.)

Autres fonctions utiles de manipulation d'images

Vous devez également connaître certaines autres fonctions courantes de GD qui sont utiles de temps en temps..

Obtenir les dimensions de l'image

Vous pouvez déterminer la largeur et la hauteur d’une ressource image à l’aide des touches imagesx () et imagesy () les fonctions.

Une autre fonction appelée getimagesize () peut également être utilisé pour obtenir la largeur et la hauteur d’une image avec son type. Cette fonction renvoie un tableau avec des éléments spécifiant la largeur, la hauteur et le format de l'image. Les deux premiers éléments du tableau décrivent la largeur et la hauteur, et le troisième contient une constante spécifiant le format du fichier: IMAGETYPE_PNG, IMAGETYPE_GIF, etc.

Sauvegarder une image

Une fois que vous avez apporté toutes les modifications souhaitées à une image, vous souhaiterez probablement la sortir dans le navigateur ou l'enregistrer sous forme de fichier. Dans les deux cas, vous devrez utiliser l’une des fonctions de sortie de GD comme imagejpeg (), imagepng (), ou imagegif (). Vous transmettez votre ressource image à l'une de ces fonctions de sortie et, si vous souhaitez enregistrer l'image dans un fichier, vous devez également spécifier un nom de fichier. Vous pouvez également contrôler la qualité de l'image de sortie à l'aide d'un troisième paramètre facultatif en fonction du type d'image..

Redimensionnement de toutes les images d'un répertoire

Appliquons les connaissances acquises jusqu’à présent pour faire quelque chose de concret. Dans cette section, nous redimensionnerons toutes les images JPEG d'un répertoire particulier pour qu'elles aient une largeur de 640 pixels. La hauteur sera calculée automatiquement en fonction des dimensions de l'image d'origine.

Nous enregistrerons les images redimensionnées dans un nouveau dossier intitulé Redimensionné. Dans ce cas, toutes les images originales ont les mêmes dimensions, mais le code fonctionnera correctement avec des images de tailles et de formats différents..

$ directory = 'Nature /'; $ images = glob ($ directory. "*. jpg"); foreach ($ images en tant que $ image) $ im_php = imagecreatefromjpeg ($ image); $ im_php = imagescale ($ im_php, 640); $ new_height = imagesy ($ im_php); $ new_name = str_replace ('- 1920x1080', '-640x'. $ new_height, nom_base ($ image)); imagejpeg ($ im_php, $ directory.'Resized /'.$ new_name); 

Dans le code ci-dessus, nous commençons par utiliser le glob () fonction pour trouver toutes les images avec un .jpg extension dans le répertoire intitulé La nature. Les fichiers image sont stockés dans un tableau et nous les parcourons un par un..

Toutes les images à redimensionner étant des fichiers JPEG, nous utilisons le imagecreatefromjpeg () fonction pour les charger dans le script. le imagescale () Cette fonction est ensuite utilisée pour redimensionner l’image à une largeur spécifique - 640 pixels dans notre cas. Nous n'avons pas spécifié de hauteur fixe, donc la hauteur sera calculée automatiquement.

Chacun des fichiers d’image originaux avait -1920x1080 ajouté au nom de fichier pour indiquer ses dimensions. Nous utilisons str_replace () sur le nom de fichier d'origine et remplacez -1920X1080 avec la nouvelle taille de l'image.

Enfin, nous enregistrons les images redimensionnées dans un dossier nommé Redimensionné avec les nouveaux noms de fichiers. Vous pouvez également passer un troisième paramètre au imagejpeg () fonction pour régler la qualité du fichier d’image sauvegardé. Si le troisième paramètre est omis, les images sont enregistrées avec une qualité par défaut de 75.

Appliquer des filtres en niveaux de gris et de contraste sur chaque image d'un répertoire

Cette fois, nous appliquerons deux filtres différents sur chaque image de notre répertoire et enregistrerons le résultat final dans un répertoire différent sans modifier le nom du fichier. Nous allons plonger dans le code, et je vais expliquer ce que chaque fonction fait plus tard.

$ directory = 'Nature /'; $ images = glob ($ directory. "*. jpg"); foreach ($ images en tant que $ image) $ im_php = imagecreatefromjpeg ($ image); imagefilter ($ im_php, IMG_FILTER_GRAYSCALE); imagefilter ($ im_php, IMG_FILTER_CONTRAST, -25); $ nouveau_nom = nom_base ($ image); imagejpeg ($ im_php, $ directory.'Grayscale /'.$ new_name); 

Comme vous pouvez le constater, nous chargeons les images du La nature répertoire exactement comme nous l'avons fait pour l'exemple précédent. Cependant, nous utiliserons le filtre d'image () fonctionne cette fois pour appliquer des filtres sur la ressource image chargée. 

Remarquerez que filtre d'image () modifie l'image d'origine et renvoie VRAI ou FAUX en fonction du succès ou de l'échec de l'opération. Ceci est différent de la imagescale () fonction que nous avons utilisée dans la section précédente, qui renvoyait la ressource image mise à l'échelle.

Il est également important de garder à l'esprit que le filtre de contraste accepte les valeurs comprises entre -100 et 100. Les valeurs négatives impliquent davantage de contraste et les valeurs positives, moins. C'est le contraire de ce à quoi certaines personnes peuvent s'attendre! Une valeur de 0 laissera l'image inchangée.

Le filtre de luminosité, quant à lui, a des limites minimale et maximale de -255 et 255. La valeur négative dans ce cas implique une luminosité minimale et la valeur positive, une luminosité maximale..

Nous obtenons le nom du fichier à partir du chemin du fichier en utilisant le nom de base () fonction et puis enregistrez l'image en utilisant le imagejpeg () une fonction.

Dernières pensées

Le but de ce tutoriel était de vous familiariser avec la bibliothèque GD en PHP et de vous montrer comment utiliser toutes ces fonctions pour vous simplifier la vie. Vous pouvez utiliser les exemples à la fin du didacticiel comme guide pour écrire vos propres scripts de manipulation d'images. Par exemple, vous pouvez redimensionner une image uniquement si elle est plus large qu'une limite donnée en déterminant sa largeur à l'aide de la touche imagesx () une fonction.

Toutes ces fonctions offrent de nombreuses possibilités pour faciliter la manipulation d’images et vous faire gagner beaucoup de temps au final. Si vous avez des questions concernant ce tutoriel, merci de me le faire savoir dans les commentaires..