Le langage PHP intègre un ensemble de fonctions permettant de traiter les images aux formats JPEG, PNG, GIF, WEBP et bien d'autres. Il est ainsi possible de créer ses propres fichiers images, mais aussi d'obtenir des informations sur des images existantes pour les redimensionner ou les recadrer.
Mettre en ligne et copier une photo via un formulaire
Dans cet exemple tout simple, nous allons téléverser une photo grâce à un formulaire.
photo.php
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>Envoi de photo par formulaire</title>
</head>
<body>
<form method="post" enctype="multipart/form-data">
<input type="file" name="photo">
<input type="submit">
</form>
<?php
if (isset($_FILES['photo']['tmp_name'])) {
$retour = copy($_FILES['photo']['tmp_name'], $_FILES['photo']['name']);
if($retour) {
echo '<p>La photo a bien été envoyée.</p>';
echo '<img src="' . $_FILES['photo']['name'] . '">';
}
}
?>
</body>
</html>
L'attribut et la valeur enctype='multipart/form-data' sont ici indispensables car ils permettent au formulaire d'ajouter des données binaires, c'est à dire autre chose que du texte, comme des images, des musiques, ou autres fichiers informatiques.
$_FILES['photo']['tmp_name']
Lorsqu'on appuie sur le bouton Envoyer, la photo est copiée sur le serveur distant dans un dossier temporaire (nommé tmp sur MAMP) avec un nom temporaire. Cette opération peut d'ailleurs prendre un certain temps si la photo pèse plusieurs méga-octets, un peu comme quand vous envoyez une photo par email. Une fois le fichier téléversé, le nom de ce fichier est stocké dans la variable $_FILES['photo']['tmp_name']. Si vous faites un echo de cette variable, vous obtiendrez un nom comme : fsdLDEKfdsiuovxiZERvxD
$_FILES['photo']['name']
Cette variable contient le nom d'origine du fichier mis en ligne, par exemple fleur.jpg
La fonction PHP copy(source, destination) va dupliquer la photo mise en ligne dans le dossier tmp du serveur dans le dossier où se trouve la page photo.php.
Ajouter une photo via un formulaire puis redimensionnement
Pour tester ce code, créez un dossier nommé miniatures à coté du fichier photo.php.
Récupération de l’extension du fichier dans la variable $extension. strtolower() : Conversion en minuscule afin que l’instruction conditionnelle if suivante fonctionne. strrchr() : Trouve tous les caractères de droite de la chaine $fichier_courant à partir du point inclus. On récolte donc l’extension du fichier (exemple : .html, .php, .gif, .jpg)
$im = imagecreatefromjpeg($fichier_courant)
Copie la photo en cours dans la variable $im.
$taille = getimagesize($fichier_courant)
Cette fonction renvoie un tableau contenant les 4 éléments suivants :
$taille[0] est la largeur de l'image
$taille[1] est la hauteur de l'image
$taille[2] donne un numéro correspondant au format de l'image (1 => GIF, 2 => JPEG, 3 => PNG)
$taille[3] donne une chaine de caractère utilisable directement dans la balise (base64)
$im = imagecreatetruecolor($largeur,$hauteur);
Crée une image vide 24 bits, soit 16 millions de couleurs, dans la variable $im de largeur $largeur et de hauteur $hauteur.
Copie une partie rectangulaire de l'image $src_im dans l'image $dst_im. La partie à copier est délimitée par le point ($src_x, $src_y), la largeur $src_l et la hauteur $src_h. La copie est placée dans $dst_im à partir du point ($dst_x, $dst_y). Une fonction équivalente existe : imagecopyresized(). Cette fonction sollicite moins le processeur, plus légère donc, mais l’image redimensionnée est moins jolie.
imagejpeg($im, $nom_image, $qualite_image);
Génération du fichier JPEG à partir de la variable $im. La variable $qualite_image permet de régler la qualité de l'image et la compression : entre 0 et 100.