1. Avant-Propos▲
1-A. Redimensionnement d'image▲
Quand on parle de "redimensionnement" d'image, il faut distinguer :
1- Redimensionnement "à l'affichage" :
ou comment afficher ses images à la taille d'affichage voulue ?
L'image elle-même n'est pas modifiée, seules ses dimensions d'affichage sont recalculées.
- fonction fctaffichimage() : redimensionner des images "à l'affichage"
2- Redimensionnement "physique" :
modification du "poids" de l'image (nouvelle image aux dimensions spécifiées),
- fonction fctredimimage() : L'image finale est redimensionnée "en proportions".
- fonction fctdeformimage() : L'image finale est redimensionnée "sans proportions" (déformée).
- fonction fctcropimage() : L'image finale est "coupée" ("crop centré").
3- "Signature" d'image (petit "plus" !)
- fonction fcttexteimage() : "Signature" de l'image (ajout d'un texte à l'image : copyright, date, ou légende de l'image).
4- Utilisation :
- avec base de données : upload, traitement (redimensionner image + création picto), enregistrement.
- dans un dossier (répertoire) : redimensionner des images déjà présentes.
Traitement d'image (PHP) :
Voir bibliothèque GD - bibliothèque
ImageMagick
Les formats traités ici : .jpg , .jpeg , .png
Autres formats :
- images .gif
Il semble que GD ne traite pas les gifs animés ou à fond transparent.
- images .bmp
Une solution consiste à convertir d'abord l'image en .png (ou en .wbmp)
voir bmp2png / png2bmp -
imagecreatefromwbmp
1-B. Téléchargez l'archive▲
| PHP - Fonctions de redimensionnement d'images | Téléchargement (archive zip) |
|---|---|
| PHP - Fonctions de redimensionnement d'images | PHP-FONCTION-REDIMENSIONNER-IMAGE.zipTéléchargez l'archive zip : PHP-FONCTION-REDIMENSIONNER-IMAGE.zip (miroirTéléchargez l'archive zip : PHP-FONCTION-REDIMENSIONNER-IMAGE.zip) |
| Vous pouvez déposer vos commentaires ou poser vos questions sur cette source : |
5 commentaires |
1-C. Class d'Upload▲
Cet article traite des fonctions de redimensionnement d'images, ainsi que des exemples d'utilisation.
Néanmoins, ABCIWEBVoir le Profil de ABCIWEB s'est aussi intéressé au redimensionnement dans sa Class d'UploadVoir la discussion d'ABCIWEB : Class d'Upload.
2. Redimensionnement "à l'affichage"▲
| Redimensionnement "à l'affichage" | |
|---|---|
|
|
|
|
Pour afficher une image en HTML, on utilise les options width et height de la balise <img /> :
Pour afficher l'image en conservant ses proportions de départ, on n'indique qu'un seul des deux
paramètres, le navigateur se chargeant de calculer le deuxième :
<img alt="" src="repimg/monimage.jpg" width="120" /> ou <img alt="" src="repimg/monimage.jpg" height="100" />
Mais comment faire pour que l'image tienne au mieux dans une "case" de W_max sur H_max
pixels ?
HTML ne suffit plus ... Il faut calculer les dimensions optimales.
L'image source n'est pas modifiée, seules ses dimensions d'affichage sont recalculées.
La fonction : fctaffichimage($img_Src, $W_max, $H_max) La fonction affiche : src="..." width="..." height="..." pour la balise <img ... /> Les paramètres - $img_Src : URL (chemin + NOM) de l'image Source - $W_max : LARGEUR maxi d'affichage --> ou 0 - $H_max : HAUTEUR maxi d'affichage --> ou 0 - si l'image est plus petite que la zone --> on conserve les dimensions de l'image source - si $W_max ET $H_max non définis --> on conserve les dimensions de l'image source - si $W_max = 0 --> LARGEUR auto (libre) - si $H_max = 0 --> HAUTEUR auto (libre) - sinon : on adapte les dimensions |
Exemple : <img alt="" <?php fctaffichimage('repimg/monimage.jpg', 120, 100) ?> />
<?php
// © Jérome Réaux : http://j-reaux.developpez.com - http://www.jerome-reaux-creations.fr
// ---------------------------------------------------
// Fonction de redimensionnement A L'AFFICHAGE
// ---------------------------------------------------
// La FONCTION : fctaffichimage($img_Src, $W_max, $H_max)
// Les paramètres :
// - $img_Src : URL (chemin + NOM) de l'image Source
// - $W_max : LARGEUR maxi finale ----> ou 0 : largeur libre
// - $H_max : HAUTEUR maxi finale ----> ou 0 : hauteur libre
// ---------------------
// Affiche : src="..." width="..." height="..." pour la balise img
// Utilisation :
// <img alt="" <?php fctaffichimage('repimg/monimage.jpg', 120, 100) ?> />
// ---------------------------------------------------
function fctaffichimage($img_Src, $W_max, $H_max) {
if (file_exists($img_Src)) {
// ---------------------
// Lit les dimensions de l'image source
$img_size = getimagesize($img_Src);
$W_Src = $img_size[0]; // largeur source
$H_Src = $img_size[1]; // hauteur source
// ---------------------
if(!$W_max) { $W_max = 0; }
if(!$H_max) { $H_max = 0; }
// ---------------------
// Teste les dimensions tenant dans la zone
$W_test = round($W_Src * ($H_max / $H_Src));
$H_test = round($H_Src * ($W_max / $W_Src));
// ---------------------
// si l'image est plus petite que la zone
if($W_Src<$W_max && $H_Src<$H_max) {
$W = $W_Src;
$H = $H_Src;
// sinon si $W_max et $H_max non definis
} elseif($W_max==0 && $H_max==0) {
$W = $W_Src;
$H = $H_Src;
// sinon si $W_max libre
} elseif($W_max==0) {
$W = $W_test;
$H = $H_max;
// sinon si $H_max libre
} elseif($H_max==0) {
$W = $W_max;
$H = $H_test;
// sinon les dimensions qui tiennent dans la zone
} elseif($H_test > $H_max) {
$W = $W_test;
$H = $H_max;
} else {
$W = $W_max;
$H = $H_test;
}
// ---------------------
} else { // si le fichier image n existe pas
$W = 0;
$H = 0;
}
// ---------------------------------------------------
// Affiche : src="..." width="..." height="..." pour la balise img
echo ' src="'.$img_Src.'" width="'.$W.'" height="'.$H.'"';
// ---------------------------------------------------
};
?>
3. Redimensionnement physique "proportionnel"▲
| Redimensionnement physique "proportionnel" | |
|---|---|
|
|
|
|
La fonction : fctredimimage ($W_max, $H_max, $rep_Dst, $img_Dst, $rep_Src, $img_Src) Redimensionnement "physique "en proportions" (conserve les proportions de l'image) 3 options A- "normal" : image finale à HAUTEUR ET LARGEUR maxi fixes. B- "hauteur" : image finale à HAUTEUR maxi fixe (largeur auto) C- "largeur" : image finale à LARGEUR maxi fixe (hauteur auto) NB : Si l'image Source est plus petite que les dimensions indiquées : PAS de redimensionnement. Mais on peut "forcer" le redimensionnement en ajoutant : $condition = 1; (voir le code) Retourne la valeur : - 1 (vrai) si le redimensionnement et l'enregistrement ont bien eu lieu, - sinon rien (false) Les paramètres : - $W_max : LARGEUR maxi finale --> ou 0 - $H_max : HAUTEUR maxi finale --> ou 0 - $rep_Dst : répertoire de l'image de destination (déprotégé) --> ou '' - $img_Dst : NOM de l'image de destination --> ou '' - $rep_Src : répertoire de l'image source (déprotégé) - $img_Src : NOM de l'image source Les 3 options A- si $W_max != 0 et $H_max != 0 --> à a LARGEUR maxi ET HAUTEUR maxi fixes B- si $H_max != 0 et $W_max == 0 --> à HAUTEUR maxi fixe (largeur auto) C- si $W_max == 0 et $H_max != 0 --> à LARGEUR maxi fixe (hauteur auto) NB : $rep_Dst : il faut s'assurer que les droits en écriture ont été donnés au dossier (chmod) - si $rep_Dst = '' --> $rep_Dst = $rep_Src (même répertoire que l'image Source) - si $img_Dst = '' --> $img_Dst = $img_Src (même nom que l'image Source) - si $rep_Dst='' ET $img_Dst='' --> on écrase (remplace) l'image Source ! Extensions : - acceptées (traitées ici) : .jpg , .jpeg , .png - $img_Dst et $img_Src doivent avoir la même extension (même type mime) ! Pour ajouter d'autres extensions : Voir bibliothèque GD - bibliothèque ImageMagick |
<?php
$redimOK = fctredimimage(120,80,'reppicto/','monpicto.jpg','repimage/','monimage.jpg');
if ($redimOK == 1) { echo 'Redimensionnement OK !'; }
?>
<?php
// © Jérome Réaux : http://j-reaux.developpez.com - http://www.jerome-reaux-creations.fr
// ---------------------------------------------------
// Fonction de REDIMENSIONNEMENT physique "PROPORTIONNEL" et Enregistrement
// ---------------------------------------------------
// retourne : true si le redimensionnement et l'enregistrement ont bien eu lieu, sinon false
// ---------------------
// La FONCTION : fctredimimage ($W_max, $H_max, $rep_Dst, $img_Dst, $rep_Src, $img_Src)
// Les paramètres :
// - $W_max : LARGEUR maxi finale --> ou 0
// - $H_max : HAUTEUR maxi finale --> ou 0
// - $rep_Dst : repertoire de l'image de Destination (déprotégé) --> ou '' (même répertoire)
// - $img_Dst : NOM de l'image de Destination --> ou '' (même nom que l'image Source)
// - $rep_Src : repertoire de l'image Source (déprotégé)
// - $img_Src : NOM de l'image Source
// ---------------------
// 3 options :
// A- si $W_max!=0 et $H_max!=0 : a LARGEUR maxi ET HAUTEUR maxi fixes
// B- si $H_max!=0 et $W_max==0 : image finale a HAUTEUR maxi fixe (largeur auto)
// C- si $W_max==0 et $H_max!=0 : image finale a LARGEUR maxi fixe (hauteur auto)
// Si l'image Source est plus petite que les dimensions indiquées : PAS de redimensionnement.
// ---------------------
// $rep_Dst : il faut s'assurer que les droits en écriture ont été donnés au dossier (chmod)
// - si $rep_Dst = '' : $rep_Dst = $rep_Src (même répertoire que l'image Source)
// - si $img_Dst = '' : $img_Dst = $img_Src (même nom que l'image Source)
// - si $rep_Dst='' ET $img_Dst='' : on ecrase (remplace) l'image source !
// ---------------------
// NB : $img_Dst et $img_Src doivent avoir la meme extension (meme type mime) !
// Extensions acceptées (traitees ici) : .jpg , .jpeg , .png
// Pour Ajouter d autres extensions : voir la bibliotheque GD ou ImageMagick
// (GD) NE fonctionne PAS avec les GIF ANIMES ou a fond transparent !
// ---------------------
// UTILISATION (exemple) :
// $redimOK = fctredimimage(120,80,'reppicto/','monpicto.jpg','repimage/','monimage.jpg');
// if ($redimOK==true) { echo 'Redimensionnement OK !'; }
// ---------------------------------------------------
function fctredimimage($W_max, $H_max, $rep_Dst, $img_Dst, $rep_Src, $img_Src) {
$condition = 0;
// Si certains paramètres ont pour valeur '' :
if ($rep_Dst=='') { $rep_Dst = $rep_Src; } // (même répertoire)
if ($img_Dst=='') { $img_Dst = $img_Src; } // (même nom)
// ---------------------
// si le fichier existe dans le répertoire, on continue...
if (file_exists($rep_Src.$img_Src) && ($W_max!=0 || $H_max!=0)) {
// ----------------------
// extensions acceptées :
$extension_Allowed = 'jpg,jpeg,png'; // (sans espaces)
// extension fichier Source
$extension_Src = strtolower(pathinfo($img_Src,PATHINFO_EXTENSION));
// ----------------------
// extension OK ? on continue ...
if(in_array($extension_Src, explode(',', $extension_Allowed))) {
// ------------------------
// récupération des dimensions de l'image Src
$img_size = getimagesize($rep_Src.$img_Src);
$W_Src = $img_size[0]; // largeur
$H_Src = $img_size[1]; // hauteur
// ------------------------
// condition de redimensionnement et dimensions de l'image finale
// ------------------------
// A- LARGEUR ET HAUTEUR maxi fixes
if ($W_max!=0 && $H_max!=0) {
$ratiox = $W_Src / $W_max; // ratio en largeur
$ratioy = $H_Src / $H_max; // ratio en hauteur
$ratio = max($ratiox,$ratioy); // le plus grand
$W = $W_Src/$ratio;
$H = $H_Src/$ratio;
$condition = ($W_Src>$W) || ($W_Src>$H); // 1 si vrai (true)
}
// ------------------------
// B- HAUTEUR maxi fixe
if ($W_max==0 && $H_max!=0) {
$H = $H_max;
$W = $H * ($W_Src / $H_Src);
$condition = ($H_Src > $H_max); // 1 si vrai (true)
}
// ------------------------
// C- LARGEUR maxi fixe
if ($W_max!=0 && $H_max==0) {
$W = $W_max;
$H = $W * ($H_Src / $W_Src);
$condition = ($W_Src > $W_max); // 1 si vrai (true)
}
// ---------------------------------------------
// REDIMENSIONNEMENT si la condition est vraie
// ---------------------------------------------
// - Si l'image Source est plus petite que les dimensions indiquées :
// Par defaut : PAS de redimensionnement.
// - Mais on peut "forcer" le redimensionnement en ajoutant ici :
// $condition = 1; (risque de perte de qualité)
if ($condition==1) {
// ---------------------
// creation de la ressource-image "Src" en fonction de l extension
switch($extension_Src) {
case 'jpg':
case 'jpeg':
$Ress_Src = imagecreatefromjpeg($rep_Src.$img_Src);
break;
case 'png':
$Ress_Src = imagecreatefrompng($rep_Src.$img_Src);
break;
}
// ---------------------
// creation d une ressource-image "Dst" aux dimensions finales
// fond noir (par defaut)
switch($extension_Src) {
case 'jpg':
case 'jpeg':
$Ress_Dst = imagecreatetruecolor($W,$H);
break;
case 'png':
$Ress_Dst = imagecreatetruecolor($W,$H);
// fond transparent (pour les png avec transparence)
imagesavealpha($Ress_Dst, true);
$trans_color = imagecolorallocatealpha($Ress_Dst, 0, 0, 0, 127);
imagefill($Ress_Dst, 0, 0, $trans_color);
break;
}
// ---------------------
// REDIMENSIONNEMENT (copie, redimensionne, re-echantillonne)
imagecopyresampled($Ress_Dst, $Ress_Src, 0, 0, 0, 0, $W, $H, $W_Src, $H_Src);
// ---------------------
// ENREGISTREMENT dans le repertoire (avec la fonction appropriee)
switch ($extension_Src) {
case 'jpg':
case 'jpeg':
imagejpeg ($Ress_Dst, $rep_Dst.$img_Dst);
break;
case 'png':
imagepng ($Ress_Dst, $rep_Dst.$img_Dst);
break;
}
// ------------------------
// liberation des ressources-image
imagedestroy ($Ress_Src);
imagedestroy ($Ress_Dst);
}
// ------------------------
}
}
// ---------------------------------------------------
// retourne : true si le redimensionnement et l'enregistrement ont bien eu lieu, sinon false
if ($condition==1 && file_exists($rep_Dst.$img_Dst)) { return true; }
else { return false; }
// ---------------------------------------------------
};
?>
4. Redimensionnement physique "non-proportionnel"▲
| Redimensionnement physique "non-proportionnel" | |
|---|---|
|
|
|
|
La fonction : fctdeformimage ($W_fin, $H_fin, $rep_Dst, $img_Dst, $rep_Src, $img_Src) Redimensionnement physique "non-proportionnel" (les proportions de l'image NE sont PAS conservées : elle sera donc déformée) 3 options A- "normal" : image finale à HAUTEUR ET LARGEUR fixes. B- "hauteur" : image finale à HAUTEUR fixe (largeur de la source) C- "largeur" : image finale à LARGEUR fixe (hauteur de la source) NB : Dans TOUS les cas : redimensionnement non-proportionnel de l'image. Retourne la valeur : - 1 (vrai) si le redimensionnement et l'enregistrement ont bien eu lieu, - sinon rien (false) Les paramètres : - $W_fin : LARGEUR finale --> ou 0 - $H_fin : HAUTEUR finale --> ou 0 - $rep_Dst : répertoire de l'image de destination (déprotégé) --> ou '' - $img_Dst : NOM de l'image de destination --> ou '' - $rep_Src : répertoire de l'image source (déprotégé) - $img_Src : NOM de l'image source Les 3 options A- si $W_fin != 0 et $H_fin != 0 --> à LARGEUR ET HAUTEUR fixes B- si $H_fin != 0 et $W_fin == 0 --> à HAUTEUR fixe (largeur de la source) C- si $W_fin == 0 et $H_fin != 0 --> à LARGEUR fixe (hauteur de la source) NB : $rep_Dst : il faut s'assurer que les droits en écriture ont été donnés au dossier (chmod) - si $rep_Dst = '' --> $rep_Dst = $rep_Src (même répertoire que l'image Source) - si $img_Dst = '' --> $img_Dst = $img_Src (même nom que l'image Source) - si $rep_Dst='' ET $img_Dst='' --> on écrase (remplace) l'image Source ! Extensions : - acceptées (traitées ici) : .jpg , .jpeg , .png - $img_Dst et $img_Src doivent avoir la même extension (même type mime) ! Pour ajouter d'autres extensions : Voir bibliothèque GD - bibliothèque ImageMagick |
<?php
$deformOK = fctdeformimage(120,80,'reppicto/','monpicto.jpg','repimage/','monimage.jpg');
if ($deformOK == 1) { echo 'Redimensionnement OK !'; }
?>
<?php
// ---------------------------------------------------
// fonction de REDIMENSIONNEMENT physique "NON-PROPORTIONNEL" et Enregistrement
// ---------------------------------------------------
// © Jérome Réaux : http://j-reaux.developpez.com - http://www.jerome-reaux-creations.fr
// ---------------------
// retourne : 1 (vrai) si le redimensionnement et l'enregistrement ont bien eu lieu, sinon rien (false)
// ---------------------// La FONCTION : fctdeformimage ($W_fin, $H_fin, $rep_Dst, $img_Dst, $rep_Src, $img_Src)
// Les paramètres :
// - $W_fin : LARGEUR finale --> ou 0
// - $H_fin : HAUTEUR finale --> ou 0
// - $rep_Dst : repertoire de l'image de Destination (déprotégé) --> ou '' (même répertoire)
// - $img_Dst : NOM de l'image de Destination --> ou '' (même nom que l'image Source)
// - $rep_Src : repertoire de l'image Source (déprotégé)
// - $img_Src : NOM de l'image Source
// ------------------------
// 3 options :
// A- si $W_fin != 0 et $H_fin != 0 : image finale a LARGEUR ET HAUTEUR fixes
// B- si $H_fin != 0 et $W_fin == 0 : image finale a HAUTEUR fixe (largeur auto)
// C- si $W_fin == 0 et $H_fin != 0 : image finale a LARGEUR fixe (hauteur auto)
// Dans TOUS les cas : redimensionnement non-proportionnel
// ------------------------
// $rep_Dst : il faut s'assurer que les droits en écriture ont été donnés au dossier (chmod)
// - si $rep_Dst = '' : $rep_Dst = $rep_Src (même répertoire que l'image Source)
// - si $img_Dst = '' : $img_Dst = $img_Src (même nom que l'image Source)
// - si $rep_Dst='' ET $img_Dst='' : on ecrase (remplace) l'image source !
// ------------------------
// NB : $img_Dst et $img_Src doivent avoir la meme extension (meme type mime) !
// Extensions acceptées (traitees ici) : .jpg , .jpeg , .png
// Pour ajouter d autres extensions : voir la bibliotheque GD ou ImageMagick
// (GD) NE fonctionne PAS avec les GIF ANIMES ou a fond transparent !
// ------------------------
// UTILISATION (exemple) :
// $deformOK = fctredimimage(120,80,'reppicto/','monpicto.jpg','repimage/','monimage.jpg');
// if ($deformOK == 1) { echo 'Redimensionnement OK !'; }
// ---------------------------------------------------
function fctdeformimage($W_fin, $H_fin, $rep_Dst, $img_Dst, $rep_Src, $img_Src) {
// Si certains paramètres ont pour valeur '' :
if ($rep_Dst == '') { $rep_Dst = $rep_Src; } // (même répertoire)
if ($img_Dst == '') { $img_Dst = $img_Src; } // (même nom)
// ------------------------
// si le fichier existe dans le répertoire, on continue...
if (file_exists($rep_Src.$img_Src) && ($W_fin!=0 || $H_fin!=0)) {
// ------------------------
// extensions acceptées :
$extension_Allowed = 'jpg,jpeg,png'; // (sans espaces)
// extension fichier Source
$extension_Src = strtolower(pathinfo($img_Src,PATHINFO_EXTENSION));
// ------------------------
// extension OK ? on continue ...
if(in_array($extension_Src, explode(',', $extension_Allowed))) {
// ------------------------
// récupération des dimensions de l'image Src
$img_size = getimagesize($rep_Src.$img_Src);
$W_Src = $img_size[0]; // largeur
$H_Src = $img_size[1]; // hauteur
// ------------------------
// condition de redimensionnement et dimensions de l'image finale
// Dans TOUS les cas : redimensionnement non-proportionnel
// ------------------------
// A- LARGEUR ET HAUTEUR fixes
if ($W_fin != 0 && $H_fin != 0) {
$W = $W_fin;
$H = $H_fin;
}
// ------------------------
// B- HAUTEUR fixe
if ($W_fin == 0 && $H_fin != 0) {
$W = $W_Src;
$H = $H_fin;
}
// ------------------------
// C- LARGEUR fixe
if ($W_fin != 0 && $H_fin == 0) {
$W = $W_fin;
$H = $H_Src;
}
// ------------------------------------------------
// REDIMENSIONNEMENT
// ------------------------------------------------
// creation de la ressource-image "Src" en fonction de l extension
switch($extension_Src) {
case 'jpg':
case 'jpeg':
$Ress_Src = imagecreatefromjpeg($rep_Src.$img_Src);
break;
case 'png':
$Ress_Src = imagecreatefrompng($rep_Src.$img_Src);
break;
}
// ------------------------
// creation d une ressource-image "Dst" aux dimensions finales
// fond noir (par defaut)
switch($extension_Src) {
case 'jpg':
case 'jpeg':
$Ress_Dst = imagecreatetruecolor($W,$H);
break;
case 'png':
$Ress_Dst = imagecreatetruecolor($W,$H);
// fond transparent (pour les png avec transparence)
imagesavealpha($Ress_Dst, true);
$trans_color = imagecolorallocatealpha($Ress_Dst, 0, 0, 0, 127);
imagefill($Ress_Dst, 0, 0, $trans_color);
break;
}
// ------------------------------------------------
// REDIMENSIONNEMENT (copie, redimensionne, re-echantillonne)
imagecopyresampled($Ress_Dst, $Ress_Src, 0, 0, 0, 0, $W, $H, $W_Src, $H_Src);
// ------------------------------------------------
// ENREGISTREMENT dans le repertoire (avec la fonction appropriee)
switch ($extension_Src) {
case 'jpg':
case 'jpeg':
imagejpeg ($Ress_Dst, $rep_Dst.$img_Dst);
break;
case 'png':
imagepng ($Ress_Dst, $rep_Dst.$img_Dst);
break;
}
// ------------------------
// liberation des ressources-image
imagedestroy ($Ress_Src);
imagedestroy ($Ress_Dst);
// ------------------------
}
}
// ---------------------------------------------------
// retourne : true si le redimensionnement et l'enregistrement ont bien eu lieu, sinon false
if (file_exists($rep_Dst.$img_Dst)) { return true; }
else { return false; }
// ---------------------------------------------------
};
?>
5. Redimensionnement physique "crop centré"▲
| Redimensionnement physique "crop centré" | |
|---|---|
|
|
|
|
La fonction : fctcropimage ($W_fin, $H_fin, $rep_Dst, $img_Dst, $rep_Src, $img_Src) Redimensionnement physique "crop centré" (l'image est "coupée" aux dimensions voulues) 4 options A- "normal" : crop "centré" aux dimensions indiquées B- "hauteur" : crop "centré" de la hauteur indiquée (même largeur que la source) C- "largeur" : crop "centré" de la largeur indiquée (même hauteur que la source) D- "cas spécial" : crop "carré" à la plus petite dimension de l'image source Retourne la valeur : - 1 (vrai) si le redimensionnement et l'enregistrement ont bien eu lieu, - sinon rien (false) Les paramètres : - $W_fin : LARGEUR finale --> ou 0 - $H_fin : HAUTEUR finale --> ou 0 - $rep_Dst : répertoire de l'image de destination (déprotégé) --> ou '' - $img_Dst : NOM de l'image de destination --> ou '' - $rep_Src : répertoire de l'image source (déprotégé) - $img_Src : NOM de l'image source Les 4 options A- si $W_fin != 0 et $H_fin != 0 --> crop aux dimensions indiquées B- si $W_fin == 0 et $H_fin != 0 --> crop en HAUTEUR (même largeur que la source) C- si $W_fin != 0 et $H_fin == 0 --> crop en LARGEUR (même hauteur que la source) D- si $W_fin == 0 et $H_fin == 0 --> (cas spécial) crop "carré" à la plus petite dimension de l'image source NB : $rep_Dst : il faut s'assurer que les droits en écriture ont été donnés au dossier (chmod) - si $rep_Dst = '' --> $rep_Dst = $rep_Src (même répertoire) - si $img_Dst = '' --> $img_Dst = $img_Src (même nom) - si $rep_Dst='' ET $img_Dst='' --> on écrase (remplace) l'image source ! Extensions : - acceptées (traitées ici) : .jpg , .jpeg , .png - $img_Dst et $img_Src doivent avoir la même extension (même type mime) ! Pour ajouter d'autres extensions : Voir bibliothèque GD - bibliothèque ImageMagick |
<?php
$cropOK = fctcropimage(120,80,'reppicto/','monpicto.jpg','repimage/','monimage.jpg');
if ($cropOK == 1) { echo 'Crop centré OK !'; }
?>
<?php
$redim = fctcropimage(0,0,$repDest,$imageDest,$repSource,$imageSource);
$redim = fctredimimage(100,0,'','',$repDest,$imageDest);
if ($redim==true) { echo 'picto carré créé !'; }
?>
| Picto toujours carré | |
|---|---|
|
|
<?php
// © Jérome Réaux : http://j-reaux.developpez.com - http://www.jerome-reaux-creations.fr
// ---------------------------------------------------
// Fonction de REDIMENSIONNEMENT physique "CROP CENTRE" et Enregistrement
// ---------------------------------------------------
// retourne : true si le redimensionnement et l'enregistrement ont bien eu lieu, sinon false
// ---------------------
// La FONCTION : fctcropimage ($W_fin, $H_fin, $rep_Dst, $img_Dst, $rep_Src, $img_Src)
// Les paramètres :
// - $W_fin : LARGEUR finale --> ou 0
// - $H_fin : HAUTEUR finale --> ou 0
// - $rep_Dst : repertoire de l'image de Destination (déprotégé) --> ou ''
// - $img_Dst : NOM de l'image de Destination --> ou ''
// - $rep_Src : repertoire de l'image Source (déprotégé)
// - $img_Src : NOM de l'image Source
// ---------------------
// 4 options :
// A- si $W_fin!=0 et $H_fin!=0 : crop aux dimensions indiquées
// B- si $W_fin==0 et $H_fin!=0 : crop en HAUTEUR (meme largeur que la source)
// C- si $W_fin!=0 et $H_fin==0 : crop en LARGEUR (meme hauteur que la source)
// D- si $W_fin==0 et $H_fin==0 : (special) crop "carre" a la plus petite dimension de l'image source
// ---------------------
// $rep_Dst : il faut s'assurer que les droits en écriture ont été donnés au dossier (chmod)
// - si $rep_Dst = '' --> $rep_Dst = $rep_Src (même répertoire que le repertoire Source)
// - si $img_Dst = '' --> $img_Dst = $img_Src (même nom que l'image Source)
// - si $rep_Dst = '' ET $img_Dst = '' --> on ecrase (remplace) l'image source ($img_Src) !
// ---------------------
// NB : $img_Dst et $img_Src doivent avoir la meme extension (meme type mime) !
// Extensions acceptées (traitees ici) : .jpg , .jpeg , .png
// Pour Ajouter d autres extensions : voir la bibliotheque GD ou ImageMagick
// (GD) NE fonctionne PAS avec les GIF ANIMES ou a fond transparent !
// ---------------------
// UTILISATION (exemple) :
// $cropOK = fctcropimage(120,80,'reppicto/','monpicto.jpg','repimage/','monimage.jpg');
// if ($cropOK==true) { echo 'Crop centré OK !'; }
// ---------------------
function fctcropimage($W_fin, $H_fin, $rep_Dst, $img_Dst, $rep_Src, $img_Src) {
// ---------------------
$condition = 0;
// Si certains paramètres ont pour valeur '' :
if ($rep_Dst=='') { $rep_Dst = $rep_Src; } // (même répertoire)
if ($img_Dst=='') { $img_Dst = $img_Src; } // (même nom)
// ---------------------
// si le fichier existe dans le répertoire, on continue...
if (file_exists($rep_Src.$img_Src)) {
// ----------------------
// extensions acceptées :
$extension_Allowed = 'jpg,jpeg,png'; // (sans espaces)
// extension fichier Source
$extension_Src = strtolower(pathinfo($img_Src,PATHINFO_EXTENSION));
// ----------------------
// extension OK ? on continue ...
if(in_array($extension_Src, explode(',', $extension_Allowed))) {
// ------------------------
// récupération des dimensions de l'image Source
$img_size = getimagesize($rep_Src.$img_Src);
$W_Src = $img_size[0]; // largeur
$H_Src = $img_size[1]; // hauteur
// ------------------------------------------------
// condition de crop et dimensions de l'image finale
// ------------------------------------------------
// A- crop aux dimensions indiquées
if ($W_fin!=0 && $H_fin!=0) {
$W = $W_fin;
$H = $H_fin;
} // ------------------------
// B- crop en HAUTEUR (meme largeur que la source)
if ($W_fin==0 && $H_fin!=0) {
$H = $H_fin;
$W = $W_Src;
}
// ------------------------
// C- crop en LARGEUR (meme hauteur que la source)
if ($W_fin!=0 && $H_fin==0) {
$W = $W_fin;
$H = $H_Src;
}
// D- crop "carre" a la plus petite dimension de l'image source
if ($W_fin==0 && $H_fin==0) {
if ($W_Src >= $H_Src) {
$W = $H_Src;
$H = $H_Src;
} else {
$W = $W_Src;
$H = $W_Src;
}
}
// ------------------------
// creation de la ressource-image "Src" en fonction de l extension
switch($extension_Src) {
case 'jpg':
case 'jpeg':
$Ress_Src = imagecreatefromjpeg($rep_Src.$img_Src);
break;
case 'png':
$Ress_Src = imagecreatefrompng($rep_Src.$img_Src);
break;
}
// ---------------------
// creation d une ressource-image "Dst" aux dimensions finales
// fond noir (par defaut)
switch($extension_Src) {
case 'jpg':
case 'jpeg':
$Ress_Dst = imagecreatetruecolor($W,$H);
// fond blanc
$blanc = imagecolorallocate ($Ress_Dst, 255, 255, 255);
imagefill ($Ress_Dst, 0, 0, $blanc);
break;
case 'png':
$Ress_Dst = imagecreatetruecolor($W,$H);
// fond transparent (pour les png avec transparence)
imagesavealpha($Ress_Dst, true);
$trans_color = imagecolorallocatealpha($Ress_Dst, 0, 0, 0, 127);
imagefill($Ress_Dst, 0, 0, $trans_color);
break;
}
// ------------------------
// CENTRAGE du crop
// coordonnees du point d origine Scr : $X_Src, $Y_Src
// coordonnees du point d origine Dst : $X_Dst, $Y_Dst
// dimensions de la portion copiee : $W_copy, $H_copy
// ------------------------
// CENTRAGE en largeur
if ($W_fin==0) {
if ($H_fin==0 && $W_Src < $H_Src) {
$X_Src = 0;
$X_Dst = 0;
$W_copy = $W_Src;
} else {
$X_Src = 0;
$X_Dst = ($W - $W_Src) /2;
$W_copy = $W_Src;
}
} else {
if ($W_Src > $W) {
$X_Src = ($W_Src - $W) /2;
$X_Dst = 0;
$W_copy = $W;
} else {
$X_Src = 0;
$X_Dst = ($W - $W_Src) /2;
$W_copy = $W_Src;
}
}
// ------------------------
// CENTRAGE en hauteur
if ($H_fin==0) {
if ($W_fin==0 && $H_Src < $W_Src) {
$Y_Src = 0;
$Y_Dst = 0;
$H_copy = $H_Src;
} else {
$Y_Src = 0;
$Y_Dst = ($H - $H_Src) /2;
$H_copy = $H_Src;
}
} else {
if ($H_Src > $H) {
$Y_Src = ($H_Src - $H) /2;
$Y_Dst = 0;
$H_copy = $H;
} else {
$Y_Src = 0;
$Y_Dst = ($H - $H_Src) /2;
$H_copy = $H_Src;
}
}
// ------------------------------------------------
// CROP par copie de la portion d image selectionnee
imagecopyresampled($Ress_Dst,$Ress_Src,$X_Dst,$Y_Dst,$X_Src,$Y_Src,$W_copy,$H_copy,$W_copy,$H_copy);
// ------------------------------------------------
// ENREGISTREMENT dans le repertoire (avec la fonction appropriee)
switch ($extension_Src) {
case 'jpg':
case 'jpeg':
imagejpeg ($Ress_Dst, $rep_Dst.$img_Dst);
break;
case 'png':
imagepng ($Ress_Dst, $rep_Dst.$img_Dst);
break;
}
// ---------------------
// liberation des ressources-image
imagedestroy ($Ress_Src);
imagedestroy ($Ress_Dst);
// ---------------------
$condition = 1;
}
}
// ---------------------------------------------------
// retourne : true si le redimensionnement et l'enregistrement ont bien eu lieu, sinon false
if ($condition==1 && file_exists($rep_Dst.$img_Dst)) { return true; }
else { return false; }
// ---------------------------------------------------
};
?>
6. "Signature" de l'image▲
| "Signature" de l'image | |
|---|---|
|
|
|
|
|
|
La fonction : fcttexteimage ($chaine, $rep_Dst, $img_Dst, $rep_Src, $img_Src, $position) "Signature" de l'image (ajout d'un texte à l'image : copyright, date, ou légende de l'image) Un petit "plus" ! Retourne la valeur : - 1 (vrai) si le texte a bien été ajouté, - sinon rien (false) Les paramètres : - $chaine : TEXTE à ajouter - $rep_Dst : répertoire de l'image de Destination (déprotégé) --> ou '' (même répertoire) - $img_Dst : NOM de l'image de Destination --> ou '' (même nom que l'image Source) - $rep_Src : répertoire de l'image Source (déprotégé) - $img_Src : NOM de l'image Source - $position : position du texte sur l'image NB : ATTENTION : si le texte est TROP long, il risque d'être tronqué ! (Privilégiez donc les textes courts) Positionnement du texte sur l'image (valeurs possibles) : - $position = 'HG' --> en Haut à Gauche (valeur par défaut) - $position = 'HD' --> en Haut à Droite - $position = 'HC' --> en Haut au Centre - $position = 'BG' --> en Bas à Gauche - $position = 'BD' --> en Bas à Droite - $position = 'BC' --> en Bas au Centre NB : $rep_Dst : il faut s'assurer que les droits en écriture ont été donnés au dossier (chmod) - si $rep_Dst = '' --> $rep_Dst = $rep_Src (même répertoire) - si $img_Dst = '' --> $img_Dst = $img_Src (même nom) - si $rep_Dst='' ET $img_Dst='' --> on écrase (remplace) l'image source ! Extensions : - acceptées (traitées ici) : .jpg , .jpeg , .png - $img_Dst et $img_Src doivent avoir la même extension (même type mime) ! Pour ajouter d'autres extensions : Voir bibliothèque GD - bibliothèque ImageMagick |
<?php
$texteOK = fcttexteimage('copyright : MOI','reppicto/','monpicto.jpg','repimage/','monimage.jpg','BG');
if ($texteOK == 1) { echo 'Ajout du texte OK !'; }
?>
<?php
// © Jérome Réaux : http://j-reaux.developpez.com - http://www.jerome-reaux-creations.fr
// ---------------------------------------------------
// Fonction d AJOUT DE TEXTE a une image et Enregistrement
// ---------------------------------------------------
// retourne : true si l ajout de texte a bien été ajouté, sinon false
// ---------------------
// La FONCTION : fcttexteimage ($chaine, $rep_Dst, $img_Dst, $rep_Src, $img_Src, $position)
// Les paramètres :
// - $chaine : TEXTE a Ajouter
// - $rep_Dst : repertoire de l'image de Destination (déprotégé) --> ou '' (même répertoire)
// - $img_Dst : NOM de l'image de Destination --> ou '' (même nom que l'image Source)
// - $rep_Src : repertoire de l'image Source (déprotégé)
// - $img_Src : NOM de l'image Source
// - $position : position du texte sur l'image
// ---------------------
// ATTENTION : si le texte est TROP long, il risque d'être tronqué !
// ---------------------
// Position du texte sur l'image (valeurs possibles) :
// $position = 'HG' --> en Haut a Gauche (valeur par defaut)
// $position = 'HD' --> en Haut a Droite
// $position = 'HC' --> en Haut au Centre
// $position = 'BG' --> en Bas a Gauche
// $position = 'BD' --> en Bas a Droite
// $position = 'BC' --> en Bas au Centre
// ---------------------
// $rep_Dst : il faut s'assurer que les droits en écriture ont été donnés au dossier (chmod)
// - si $rep_Dst = '' : $rep_Dst = $rep_Src (même répertoire que l'image Source)
// - si $img_Dst = '' : $img_Dst = $img_Src (même nom que l'image Source)
// - si $rep_Dst='' ET $img_Dst='' : on ecrase (remplace) l'image source !
// ---------------------
// NB : $img_Dst et $img_Src doivent avoir la meme extension (meme type mime) !
// Extensions acceptées (traitees ici) : .jpg , .jpeg , .png
// Pour Ajouter d autres extensions : voir la bibliotheque GD ou ImageMagick
// (GD) NE fonctionne PAS avec les GIF ANIMES ou a fond transparent !
// ---------------------
// UTILISATION (exemple copyright, ou legende de l'image) :
// $texteOK = fcttexteimage('copyright : MOI','reppicto/','monpicto.jpg','repimage/','monimage.jpg','BG');
// if ($texteOK==true) { echo 'Ajout du texte OK !'; }
// ---------------------
function fcttexteimage($chaine, $rep_Dst, $img_Dst, $rep_Src, $img_Src, $position) {
// ---------------------
$condition = 0;
$position = strtoupper($position); // on met en majuscule (par defaut)
// Si certains paramètres ont pour valeur '' :
if ($rep_Dst=='') { $rep_Dst = $rep_Src; } // (même répertoire)
if ($img_Dst=='') { $img_Dst = $img_Src; } // (même nom)
if ($position=='') { $position = 'BG'; } // en Bas A Gauche (valeur par defaut)
// ---------------------
// si le fichier existe dans le répertoire, on continue...
if (file_exists($rep_Src.$img_Src) && $chaine!='') {
// ----------------------
// extensions acceptées :
$extension_Allowed = 'jpg,jpeg,png'; // (sans espaces)
// extension fichier Source
$extension_Src = strtolower(pathinfo($img_Src,PATHINFO_EXTENSION));
// ----------------------
// extension OK ? on continue ...
if(in_array($extension_Src, explode(',', $extension_Allowed))) {
// ---------------------
// récupération des dimensions de l'image Src
$img_size = getimagesize($rep_Src.$img_Src);
$W_Src = $img_size[0]; // largeur
$H_Src = $img_size[1]; // hauteur
// ---------------------
// creation de la ressource-image "Dst" en fonction de l extension
// (a partir de l'image source)
switch($extension_Src) {
case 'jpg':
case 'jpeg':
$Ress_Dst = imagecreatefromjpeg($rep_Src.$img_Src);
break;
case 'png':
$Ress_Dst = imagecreatefrompng($rep_Src.$img_Src);
break;
}
// ------------------------------------------------
// creation de l'image TEXTE
// ------------------------------------------------
// dimension de l'image "Txt" en fonction :
// - de la longueur du texte a afficher
// - des dimensions des caracteres (7x15 pixels par caractère)
// ATTENTION : si le texte est TROP long, il risque d'être tronqué !
$W = strlen($chaine) * 7;
if ($W > $W_Src) { $W = $W_Src; }
$H = 15; // 15 pixels de haut (par defaut)
// ---------------------
// creation de la ressource-image "Txt" (en fonction de l extension)
switch($extension_Src) {
case 'jpg':
case 'jpeg':
case 'png':
$Ress_Txt = imagecreatetruecolor($W,$H);
// Couleur du Fond : blanc
$blanc = imagecolorallocate ($Ress_Txt, 255, 255, 255);
imagefill ($Ress_Txt, 0, 0, $blanc);
// Couleur du Texte : noir
$textcolor = imagecolorallocate($Ress_Txt, 0, 0, 0);
// Ecriture du TEXTE
imagestring($Ress_Txt, 3, 0, 0, $chaine, $textcolor);
break;
}
// ------------------------------------------------
// positionnement du TEXTE sur l'image
// ------------------------------------------------
if ($position=='HG') {
$X_Dest = 0;
$Y_Dest = 0;
}
if ($position=='HD') {
$X_Dest = $W_Src - $W;
$Y_Dest = 0;
}
if ($position=='HC') {
$X_Dest = ($W_Src - $W)/2;
$Y_Dest = 0;
}
if ($position=='BG') {
$X_Dest = 0;
$Y_Dest = $H_Src - $H;
}
if ($position=='BD') {
$X_Dest = $W_Src - $W;
$Y_Dest = $H_Src - $H;
}
if ($position=='BC') {
$X_Dest = ($W_Src - $W)/2;
$Y_Dest = $H_Src - $H;
}
// ------------------------------------------------
// copie par fusion de l'image "Txt" sur l'image "Dst"
// (avec transparence de 50%)
imagecopymerge ($Ress_Dst, $Ress_Txt, $X_Dest, $Y_Dest, 0, 0, $W, $H, 50);
// ------------------------------------------------
// ENREGISTREMENT dans le repertoire (en fonction de l extension)
switch ($extension_Src) {
case 'jpg':
case 'jpeg':
imagejpeg ($Ress_Dst, $rep_Dst.$img_Dst);
break;
case 'png':
imagepng ($Ress_Dst, $rep_Dst.$img_Dst);
break;
}
// ---------------------
// liberation des ressources-image
imagedestroy ($Ress_Txt);
imagedestroy ($Ress_Dst);
// ---------------------
$condition = 1;
}
}
// ---------------------------------------------------
// retourne : true si le redimensionnement et l'enregistrement ont bien eu lieu, sinon false
if ($condition==1 && file_exists($rep_Dst.$img_Dst)) { return true; }
else { return false; }
// ---------------------------------------------------
};
?>
7. Utilisation▲
7-A. Récapitulatif▲
Fonction : fctaffichimage($img_Src, $W_max, $H_max)
Exemple :
<img alt="" src="repimg/monimage.jpg" <?php fctaffichimage('repimg/monimage.jpg', 150, 100) ?> />
Fonction : fctredimimage($W_max, $H_max, $rep_Dst, $img_Dst, $rep_Src, $img_Src)
Exemple :
<?php
$redimOK = fctredimimage(120,80,'reppicto/','monpicto.jpg','repimage/','monimage.jpg');
if ($redimOK == 1) { echo 'Redimensionnement OK !'; }
?>
Fonction : fctdeformimage($W_fin, $H_fin, $rep_Dst, $img_Dst, $rep_Src, $img_Src)
Exemple :
<?php $deformOK = fctdeformimage(120,80,'reppicto/','monpicto.jpg','repimage/','monimage.jpg');
if ($deformOK == 1) { echo 'Redimensionnement OK !'; } ?>
Fonction : fctcropimage($W_fin, $H_fin, $rep_Dst, $img_Dst, $rep_Src, $img_Src)
Exemple :
<?php
$cropOK = fctcropimage(120,80,'reppicto/','monpicto.jpg','repimage/','monimage.jpg');
if ($cropOK == 1) { echo 'Crop centré OK !'; }
?>
<?php
$redim = fctcropimage(0,0,$repDest,$imageDest,$repSource,$imageSource);
$redim = fctredimimage(100,0,'','',$repDest,$imageDest);
if ($redim==true) { echo 'picto carré créé !'; }
?>
<?php
$redim = fctdeformimage(100,100,$repDest,$imageDest,$repSource,$imageSource);
if ($redim==true) { echo 'picto carré créé !'; }
?>
Fonction : fcttexteimage ($chaine, $rep_Dst, $img_Dst, $rep_Src, $img_Src, $position)
Exemple (copyright, date, ou légende de l'image) :
<?php
$texteOK = fcttexteimage('copyright : MOI','reppicto/','monpicto.jpg','repimage/','monimage.jpg','BG');
if ($texteOK == 1) { echo 'Ajout du texte OK !'; } ?>
7-B. Utilisation avec base de données▲
Pour voir un exemple fonctionnel complet, voir : PHP - Système de Gestion-Affichage de Nouvelles (avec photo et fichier joint)
Aperçu du fichier de traitement :
A/ RECUPERATION DES DONNEES DU FORMULAIRE
B/ Gestion des photos supprimées
- Suppression de l'ancienne Photo
- Suppression dans la base de donnees par UPDATE
C/ VERIFICATION / TRAITEMENT de la photo si uploadée
- extension du fichier uploadé
- Type MIME réel du fichier (important : évite les fichiers NON valides, dont l'extension a été renommée)
D/ GESTION DES ERREURS
- on vérifie les RESTRICTIONS sur les fichiers
- on vérifie la TAILLE MAXI
- on vérifie l'EXTENSION
- on vérifie le TYPE MIME
E/ si pas d'erreur : TRAITEMENT
- enregistement de la PHOTO sous forme id_nom-image(.jpg, ...).
NB : id etant unique (auto-increment), cela rend le nom de la photo unique.
- enregistrement de la photo dans le dossier
- REDIMENSIONNEMENT et SAUVEGARDE de la PHOTO (si nécessaire)
- SUPPRESSION des ANCIENNES PHOTOS (si necessaire) dans le dossier
<?php
// © Jérome Réaux : http://j-reaux.developpez.com - http://www.jerome-reaux-creations.fr
// ---------------------------------------------------
// ADMIN NEWS : TRAITEMENT des photos
// ---------------------------------------------------
// RECUPERATION DES DONNEES DU FORMULAIRE
// photo
$newsPhotoAvant = (isset($_POST['newsPhotoAvant']))? formatage_from_post($_POST['newsPhotoAvant']) : '';
$newsPhotoDelete = (isset($_POST['newsPhotoDelete']))? formatage_from_post($_POST['newsPhotoDelete']) : '';
$newsPhotoLargeur = (isset($_POST['newsPhotoLargeur']))? formatage_from_post($_POST['newsPhotoLargeur']) : '';
// -----------------
// Gestion des photos supprimees
if ($newsPhotoAvant!='' && $newsPhotoDelete=='ON')
{
// Suppression de l'ancienne Photo
if(file_exists('../../'.REP_NEWS_PHOTO.$newsPhotoAvant)) {
unlink('../../'.REP_NEWS_PHOTO.$newsPhotoAvant);
}
// -----------------
// Suppression dans la base de donnees par UPDATE
$update_query = "UPDATE ".$NEWS_TABLE." ".
" SET news_photo = '' ".
" WHERE news_id = :newsId;";
try {
$pdo_update = $pdo->prepare($update_query);
$pdo_update->bindValue(':newsId', $newsId, PDO::PARAM_INT);
$pdo_update->execute();
} catch (PDOException $e) { echo 'Erreur SQL : '. $e->getMessage().'<br/>'; die(); }
// -----------------
}
// ----------------------------------
// VERIFICATION / TRAITEMENT de la photo si uploadee
// ----------------------------------
$msgErreurPhoto = ''; // message d erreur
$traiterPhotoOK = true; // (par defaut)
if(isset($_FILES['newsPhoto']) && $_FILES['newsPhoto']['size']>0)
{
// -------------------------------------
// extension du fichier uploadé (en minuscule)
$file_Extension = strtolower(pathinfo($_FILES['newsPhoto']['name'],PATHINFO_EXTENSION));
// Type MIME réel du fichier (important : évite les fichiers NON valides, dont l'extension a été renommée)
// $finfo = new finfo(FILEINFO_MIME_TYPE, NULL); // Retourne le type mime
// $file_MimeType = $finfo->file($_FILES['newsPhoto']['tmp_name']);
// (alternative, si la CLASS finfo n'est pas supportée)
$finfo = finfo_open(FILEINFO_MIME_TYPE); // Retourne le type mime à la extension mimetype
$file_MimeType = finfo_file($finfo, $_FILES['newsPhoto']['tmp_name']);
finfo_close($finfo);
// -------------------------------------
// GESTION DES ERREURS
// -------------------------------------
// on vérifie les RESTRICTIONS sur les fichiers
if (UPLOAD_ERR_OK<>0 && UPLOAD_ERR_FORM_SIZE==2) {
$msgErreurPhoto .= 'Taille de fichier trop important ('.FILE_SIZEMAX_PHOTO.' octets)<br />';
$traiterPhotoOK = false;
}
// -----------------
// on vérifie la TAILLE MAXI
elseif ($_FILES['newsPhoto']['size'] > FILE_SIZEMAX_PHOTO) {
$msgErreurPhoto .= 'Taille de fichier supérieure à la taille maxi autorisée ('.FILE_SIZEMAX_PHOTO.' octets)<br />';
$traiterPhotoOK = false;
}
// -----------------
// on vérifie l'EXTENSION
elseif(!in_array($file_Extension, explode(',', constant('FILE_EXTENSION_PHOTO')))) {
$msgErreurPhoto .= 'L\'extension ne correspond pas (Extensions acceptées : <b>'.constant('FILE_EXTENSION_PHOTO').'</b>)<br />';
if(in_array($file_MimeType, explode(',', constant('FILE_MIMETYPE_PHOTO')))) {
$msgErreurPhoto .= '<b>Attention</b> : Ce fichier est peut-être corrompu !<br />';
$msgErreurPhoto .= 'L\'extension ne correspond pas au type MIME !<br />';
}
$traiterPhotoOK = false;
}
// -----------------
// on vérifie le TYPE MIME
elseif(!in_array($file_MimeType, explode(',', constant('FILE_MIMETYPE_PHOTO')))) {
$msgErreurPhoto .= 'Le type MIME ne correspond pas (Extensions acceptées : <b>'.constant('FILE_EXTENSION_PHOTO').'</b>)<br />';
if(in_array($file_Extension, explode(',', constant('FILE_EXTENSION_PHOTO')))) {
$msgErreurPhoto .= '<b>Attention</b> : Ce fichier est peut-être corrompu !<br />';
$msgErreurPhoto .= 'L\'extension ne correspond pas au type MIME !<br />';
}
$traiterPhotoOK = false;
}
// -----------------
if ($traiterPhotoOK===false) {
$msgErreurPhoto = '<b>Erreur (Photo)</b> :<br />'.$msgErreurPhoto.'Impossible d\'enregistrer le fichier.';
}
// -------------------------------------
// si pas d'erreur : TRAITEMENT
// -------------------------------------
if ($traiterPhotoOK===true)
{
// --------------------
// enregistement de la PHOTO sous forme id_nom-image(.jpg, ...)
// NB : id etant unique (auto-increment), cela rend le nom de la photo unique
$file_Upload = $newsId.'_'.$_FILES['newsPhoto']['name'];
$file_Upload = formatage_nom_fichier($file_Upload); // remplacement des caracteres speciaux + tout en minuscules
$file_Upload = str_replace('.jpeg','.jpg',$file_Upload); // on remplace aussi .jpeg par .jpg
// --------------------
// enregistrement de la photo dans le dossier
$temp = $_FILES['newsPhoto']['tmp_name'];
move_uploaded_file($temp, '../../'.REP_NEWS_PHOTO.$file_Upload);
// --------------------
// REDIMENSIONNEMENT et SAUVEGARDE de la PHOTO (si necessaire)
// ecraser (remplacer) la photo (meme rep, meme nom)
$redimPHOTOOK = fctredimimage($newsPhotoLargeur,0,'','','../../'.REP_NEWS_PHOTO,$file_Upload);
// --------------------
// SUPPRESSION des ANCIENNES PHOTOS (si necessaire) dans le dossier
if ($newsPhotoAvant!='' && $newsPhotoAvant!=$file_Upload)
{
if(file_exists('../../'.REP_NEWS_PHOTO.$newsPhotoAvant)) {
unlink('../../'.REP_NEWS_PHOTO.$newsPhotoAvant);
}
}
// -----------------
// enregistrement du NOM dans la base de donnees par UPDATE
$update_query = "UPDATE ".$NEWS_TABLE." SET ".
" news_photo = :file_Upload, ".
" news_photo_largeur = :newsPhotoLargeur ".
" WHERE news_id = :newsId;";
try {
$pdo_update = $pdo->prepare($update_query);
$pdo_update->bindValue(':file_Upload', $file_Upload, PDO::PARAM_STR);
$pdo_update->bindValue(':newsPhotoLargeur', $newsPhotoLargeur, PDO::PARAM_STR);
$pdo_update->bindValue(':newsId', $newsId, PDO::PARAM_INT);
$pdo_update->execute();
} catch (PDOException $e) { echo 'Erreur SQL : '. $e->getMessage().'<br/>'; die(); }
// -----------------
}
} // fin TRAITEMENT PHOTO
// ---------------------------------------------------
7-C. Utilisation dans un dossier▲
Hypothèse :
Un dossier "repPHOTOS" contenant déjà des images.
Vous souhaitez créer des images de prévisualisation (pictos) (ex. 150 x 100 pixels maxi),
et les enregistrer dans le dossier "repPHOTOS/repPICTOS".
NB :
S'assurer que les droits en écriture ont été donnés aux dossiers (chmod)
Principe :
- ouvrir le répertoire,
- lire les fichiers
- redimensionner (si nécessaire) en fonction des conditions requises
--> utilisation de la fonction fctredimimage()
- enregistrer le picto dans le dossier de destination.
NB :
Par défaut, la fonction fctredimimage() ne redimensionne pas les images plus petites que les dimensions
spécifiées.
Pour créer des pictos, pas de problème.
Sinon, une adaptation de la fonction pourrait être nécessaire.
("forcer" le redimensionnement : $condition=1)
<?php
// FONCTIONS de redimensionnement "physique"
include("fctredimimage.php");
// include("fctcropimage.php"); // (inutile ici)
// ------------------------------
// repertoire Source
$rep_Src = "repPHOTOS/";
// repertoire de Destination
$rep_Dst = "repPHOTOS/repPICTOS/";
// S'assurer que les droits en écriture ont été donnés aux dossiers (chmod)
// ------------------------------
?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>MONDOSSIER-REDIM.php</title>
</head>
<body>
<?php
// ------------------------------
// Ouverture du dossier Source
$ouvredir = opendir($rep_Src);
// ------------------------------
// pour chaque fichier du repertoire ...
while ($img_Src = readdir($ouvredir)) {
// si le fichier existe
if(is_file($rep_Src.$img_Src)) {
// ------------------------------
// CHOIX de redimensionnement : picto de 150 x 100 pixels maxi
// nom du picto : pict-(nom photo)
$img_Dst = 'pict-'.$img_Src;
// ------------------------------
// REDIMENSIONNEMENT (si les conditions sont correctes)
$RedimOK = fctredimimage(150, 100, $rep_Dst, $img_Dst, $rep_Src, $img_Src);
// ------------------------------
// (facultatif) Affichage de confirmation d'écriture
if ($RedimOK == 1 ) {
echo '<p>Picto créé : '.$rep_Dst.$img_Dst.'...</p>';
}
} // fin si existe
} // fin while
// ------------------------------
// Fermeture du dossier
closedir($ouvredir);
?>
<p>Les pictos se trouvent dans le dossier <?php echo $rep_Dst; ?></p>
</body>
</html>
8. Conclusion▲
8-A. Conclusion▲
Les fonctions proposées ici devraient répondre à la plupart des cas de redimensionnement !
8-B. Remerciements▲
Un grand remerciement à tous pour vos conseils :
yogui,
kerod,
sayrus,
loka,
Special Thanks à ma chienne Candy, qui a posé pour les photos !
| Toutes remarques, corrections, ajouts, permettant d'améliorer ou d'étoffer ce tutoriel seront les bienvenus. |
5 commentaires |
















