Fonctions de redimensionnement d'images

Utilisation avec BD (redimensionner image + picto après upload) ou dans un dossier

Image non disponible

Redimensionnement "à l'affichage", "physique" ("proportionnel", "non-proportionnel", "crop centré"), "signature" d'image, "rotation"...

9 commentaires Donner une note  l'article (5)

Article lu   fois.

L'auteur

Profil ProSite personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

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 fct_img_redim_ratio() : L'image finale est redimensionnée "en proportions".
- fonction fct_img_redim_deform() : L'image finale est redimensionnée "sans proportions" (déformée).
- fonction fct_img_redim_crop() : L'image finale est "coupée" ("crop centré").

3- "Signature" d'image (petit "plus" !)
- fonction fct_img_watermark_texte() : "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-v2019.zipTéléchargez l'archive zip : PHP-FONCTION-REDIMENSIONNER-IMAGE-v2019.zip
Vous pouvez déposer vos commentaires ou poser vos questions sur cette source : 9 commentaires Donner une note  l'article (5)

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.

Cet article traite des fonctions de redimensionnement d'images, ainsi que des exemples d'utilisation.

1-D. Mise à jour

La mise à jour du 09/10/2019 concerne :
- le remplacement des noms des fonctions
- l'ajout d'un paramètre supplémentaire (concerne fct_img_redim_affichage)
- l'ajout de nouvelles fonctions, dont la "rotation" de l'image.

2. Redimensionnement "à l'affichage"

Redimensionnement "à l'affichage"
Original-paysage Original-portrait
Original-paysage-120x80 Original-portrait-120x80


Pour afficher une image en HTML, on utilise les options width et height de la balise <img /> :

 
Sélectionnez
<img alt="" src="repimg/monimage.jpg" width="120" height="100" />


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 :

 
Sélectionnez
<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
- $px : Unité en 'px' ou '%' ('px' par défaut)

- 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
 
Sélectionnez
Exemple : <img alt="" <?php fct_img_redim_affichage('repimg/monimage.jpg', 120, 100, 'px') ?> />
fct_img_redim_affichage
Sélectionnez
<?php
// ---------------------------------------------------
// Fonction de REDIMENSIONNEMENT A L'AFFICHAGE
// ---------------------------------------------------
// © Jérome Réaux : https://j-reaux.developpez.com - https://www.jerome-reaux-creations.fr
// ---------------------
// La FONCTION : fct_img_redim_affichage( $img_Src, $W_max, $H_max, $px='px' )
// 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
// - $px : Unité en px ou %
// ---------------------
// Affiche : src="..." width="..." height="..." pour la balise img
// Utilisation :
// &lt;img alt=&quot;&quot; &lt;?php fct_img_redim_affichage('repimg/monimage.jpg', 120, 100) ?&gt; /&gt;
// ---------------------------------------------------
function fct_img_redim_affichage( $img_Src, $W_max, $H_max, $px )
{
//	if( file_exists($img_Src) ) // on DOIT utiliser une chemin RELATIF
	if( !empty($img_Src) ) 		// on peut utiliser une chemin ABSOLU
	{
		// ---------------------
		// chemin RELATIF
		$img_Src_rel 			= str_replace(SITE_URL_HTTP, PATH_RELATIF, $img_Src);
		// ---------------------
		// Lit les dimensions de l'image source
		if( !empty( $img_size = getimagesize($img_Src_rel) ) )
		{
			$W_Src = $img_size[0]; // largeur source
			$H_Src = $img_size[1]; // hauteur source
		} else {
			$W_Src = 0;
			$H_Src = 0;
		}
		// ---------------------
		if( !empty($W_Src) && !empty($H_Src) )
		{
			// -----------------
			if( empty($W_max) ){ $W_max = 0; }
			if( empty($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;
			// -----------------
			// $W_max et $H_max non definis
			} elseif( $W_max == 0 && $H_max == 0 ){
				$W = $W_Src;
				$H = $H_Src;
			// -----------------
			// $W_max libre
			} elseif( $W_max == 0 ){
				$W = $W_test;
				$H = $H_max;
			// -----------------
			// $H_max libre
			} elseif( $H_max == 0 ){
				$W = $W_max;
				$H = $H_test;
			// -----------------
			// 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;
		}
		// ---------------------
	} else { 
		// si le fichier image n existe pas
		$W = 0;
		$H = 0;
	}
	// ---------------------
	// Unité : px ou %
	$px = ( empty($px) || $px == 'px' )? 'px' : '%';
	// -----------------------------------------------
	// Affiche : src="..." width="..." height="..." pour la balise img
	echo ' src="'.$img_Src.'" width="'.$W.$px.'" height="'.$H.$px.'"';
	// N.B. on n'utilise pas style="...;" car un style inline pourrait déjà être appliqué
	// -----------------------------------------------
};
?>

3. Redimensionnement physique

3-A. Redimensionnement physique "proportionnel"

Redimensionnement physique "proportionnel"
Original-paysage Original-portrait
Original-paysage-120x80 Original-portrait-120x80

La fonction : fct_img_redim_ratio ($W_max, $H_max, $rep_Dst, $img_Dst, $rep_Src, $img_Src)

Redimensionnement "physique "en proportions" (conserve le ratio / 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
Exemple :
Sélectionnez
<?php
$redimOK = fct_img_redim_ratio(120,80,'reppicto/','monpicto.jpg','repimage/','monimage.jpg');
if ($redimOK == 1) { echo 'Redimensionnement OK !'; }
?>
fct_img_redim_ratio
Sélectionnez
<?php
// ---------------------------------------------------
// Fonction de REDIMENSIONNEMENT physique "PROPORTIONNEL" et ENREGISTEMENT
// ---------------------------------------------------
// © Jérome Réaux : https://j-reaux.developpez.com - https://www.jerome-reaux-creations.fr
// ---------------------
// retourne : true si le REDIMENSIONNEMENT et l'ENREGISTEMENT ont bien eu lieu, sinon false
// ---------------------
// La FONCTION : fct_img_redim_ratio ($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 : 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
// ---------------------
// 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 même extension (même 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 = fct_img_redim_ratio(120,80,'reppicto/','monpicto.jpg','repimage/','monimage.jpg');
// if( $redimOK == =true ){ echo 'Redimensionnement OK !'; }
// ---------------------------------------------------
function fct_img_redim_ratio( $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 = array('jpg','jpeg','png','gif');
		// extension fichier Source
		$extension = strtolower( pathinfo($img_Src, PATHINFO_EXTENSION) );
		// extension OK ? on continue ...
		if( in_array($extension, $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 ){
				$ratio_X = $W_Src / $W_max; // ratio en largeur
				$ratio_Y = $H_Src / $H_max; // ratio en hauteur
				$ratio = max($ratio_X,$ratio_Y); // le plus grand
				$W = $W_Src/$ratio;
				$H = $H_Src/$ratio;	
				$condition = ($W_Src>$W) || ($H_Src>$H); // 1 si vrai (true)
			// B- HAUTEUR maxi fixe
			} elseif( $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
			} elseif( $W_max != 0 && $H_max == 0 ){
				$W = $W_max;
				$H = $W * ($H_Src / $W_Src);		
				$condition = ($W_Src > $W_max); // 1 si vrai (true)
			}
			// ------------------------
			if( $condition != 1)  // mêmes dimensions
			{
				$W = $W_Src;
				$H = $H_Src;		
				$condition = 1; // vrai (true) -> ON FORCE ici la condition = on oblige le redimensionnement/enregistrement
			}

			// ------------------------------------------------
			// REDIMENSIONNEMENT
			// ------------------------------------------------
			if( $condition == 1) 
			{
				// ---------------------
				// creation de la ressource-image "Src" en fonction de l extension
				switch($extension ){
				case 'jpg':
				case 'jpeg':
					$Ress_Src = imagecreatefromjpeg($rep_Src.$img_Src);
					break;
				case 'png':
					$Ress_Src = imagecreatefrompng($rep_Src.$img_Src);
					break;
				case 'gif':
					$Ress_Src = imagecreatefromgif($rep_Src.$img_Src);
				  break;
				}
				// ---------------------
				// creation d une ressource-image "Dst" aux dimensions finales
				// fond noir (par défaut)
				switch($extension ){
				case 'jpg':
				case 'jpeg':
				case 'gif':
					$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); 
				// ------------------------------------------------
				$imgJPG_Quality = 75;	// 0=nul / 75=moyen / 100=meilleur (mais image plus lourde)
				$imgPNG_Quality = 7;	// 0=nul / 7=moyen / 9=meilleur (mais image plus lourde)
				// ENREGISTREMENT dans le répertoire (avec la fonction appropriee)
				switch ($extension ){ 
				case 'jpg':
				case 'jpeg':
					imagejpeg ($Ress_Dst, $rep_Dst.$img_Dst, $imgJPG_Quality);
					break;
				case 'png':
					imagepng ($Ress_Dst, $rep_Dst.$img_Dst, $imgPNG_Quality);
					break;
				case 'gif':
					imagegif ($Ress_Dst, $rep_Dst.$img_Dst );
					break;
				}
				// ------------------------
				// liberation des ressources-image
				imagedestroy ($Ress_Src);
				imagedestroy ($Ress_Dst);
				// ------------------------
			} else {
				// ------------------------------------------------
				// PAS de redimensionnement
				if( $rep_Src.$img_Src != $rep_Dst.$img_Dst ){
					// On COPIE le fichier TEL QUEL
					copy($rep_Src.$img_Src, $rep_Dst.$img_Dst);
				}
				// ------------------------------------------------
			}
		}
	}
	// -----------------------------------------------
	// retourne : true si le REDIMENSIONNEMENT et l'ENREGISTEMENT ont bien eu lieu, sinon false
	if( $condition == 1 && file_exists($rep_Dst.$img_Dst) ){ return true; }
	else { return false; }
	// -----------------------------------------------
};
?>

3-B. Redimensionnement physique "proportionnel forcé"

On force ici le redimensionnement ($condition = 1).
Contrairement à la fonction précédente, une image plus petite que les dimensions indiquées sera "forcée" à être redimensionnée (avec risque de perte de qualité).

fct_img_redim_ratio_force
Sélectionnez
<?php
// --------------------------------------------------------------
// fonction de REDIMENSIONNEMENT physique "PROPORTIONNEL FORCE" et Enregistrement
// © Jérome Réaux : https://j-reaux.developpez.com - https://www.jerome-reaux-creations.fr
// ---------------------
// on force le redimensionnement =>  $condition = 1;
// --------------------------------------------------------------
function fct_img_redim_ratio_force( $W_max, $H_max, $rep_Dst, $img_Dst, $rep_Src, $img_Src )
{
	// -------------------
	$condition = 0;
	// ---------------------
	if( $rep_Dst == '' ){ $rep_Dst = $rep_Src; } // (meme repertoire)
	if( $img_Dst == '' ){ $img_Dst = $img_Src; } // (meme 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 = array('jpg','jpeg','png','gif');
		// extension fichier Source
		$extension = strtolower( pathinfo($img_Src, PATHINFO_EXTENSION) );
		// extension OK ? on continue ...
		if( in_array($extension, $extension_allowed) )
		{
			// --------------------
			// recuperation 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 ){
				$ratio_X = $W_Src / $W_max; // ratio en largeur
				$ratio_Y = $H_Src / $H_max; // ratio en hauteur
				$ratio = max($ratio_X,$ratio_Y); // le plus grand
				$W = $W_Src/$ratio;
				$H = $H_Src/$ratio;	
				$condition = ($W_Src>$W) || ($H_Src>$H); // 1 si vrai (true)
			
			// --------------------
			// B- HAUTEUR maxi fixe
			} elseif( $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
			} elseif( $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
			// => ON FORCE le redimensionnement/enregistrement (risque de perte de qualite)
			$condition = 1;
			// --------------------
			if( $condition == 1 )
			{
				// -----------------
				// creation de la ressource-image "Src" en fonction de l extension
				switch($extension ){
					case 'jpg':
					case 'jpeg':
						$Ress_Src = imagecreatefromjpeg($rep_Src.$img_Src);
						break;
					case 'png':
						$Ress_Src = imagecreatefrompng($rep_Src.$img_Src);
						break;
					case 'gif':
						$Ress_Src = imagecreatefromgif($rep_Src.$img_Src);
						break;
				}
				// -----------------
				// creation d une ressource-image "Dst" aux dimensions finales
				// fond noir (par defaut)
				switch($extension ){
					case 'jpg':
					case 'jpeg':
					case 'gif':
						$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, 255, 255, 255, 127); // BLANC
						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); 
				// -----------------
				$imgJPG_Quality = 75;	// 0=nul / 75=moyen / 100=meilleur (mais image plus lourde)
				$imgPNG_Quality = 7;	// 0=nul / 7=moyen / 9=meilleur (mais image plus lourde)
				// ENREGISTREMENT dans le repertoire (avec la fonction appropriee)
				switch ($extension ){ 
					case 'jpg':
					case 'jpeg':
						imagejpeg ($Ress_Dst, $rep_Dst.$img_Dst, $imgJPG_Quality);
						break;
					case 'png':
						imagepng ($Ress_Dst, $rep_Dst.$img_Dst, $imgPNG_Quality);
						break;
					case 'gif':
						imagegif ($Ress_Dst, $rep_Dst.$img_Dst );
						break;
				}
				// -----------------
				// liberation des ressources-image
				imagedestroy ($Ress_Src);
				imagedestroy ($Ress_Dst);
				// -----------------
			} else {
				// ------------------------------------------------
				// PAS de redimensionnement
				if( $rep_Src.$img_Src != $rep_Dst.$img_Dst ){
					// On COPIE le fichier TEL QUEL
					copy($rep_Src.$img_Src, $rep_Dst.$img_Dst);
				}
				// ------------------------------------------------
			}
		}
	}
	// -----------------------------
	// si le fichier a bien ete cree
	if( $condition == 1 && file_exists($rep_Dst.$img_Dst) ){ return true; }
	else { return false; }
}
// retourne : true si le redimensionnement et l enregistrement ont bien eu lieu, sinon false
// --------------------------------------------------------------
?>

3-C. Redimensionnement physique "non-proportionnel"

Redimensionnement physique "non-proportionnel"
Original-paysage Original-portrait
Original-paysage-120x80non Original-portrait-120x80non

La fonction : fct_img_redim_deform ($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
Exemple :
Sélectionnez
<?php
$deformOK = fct_img_redim_deform(120,80,'reppicto/','monpicto.jpg','repimage/','monimage.jpg');
if ($deformOK == 1) { echo 'Redimensionnement OK !'; }
?>
fct_img_redim_deform
Sélectionnez
<?php
// ---------------------------------------------------
// fonction de REDIMENSIONNEMENT physique "NON-PROPORTIONNEL" et ENREGISTEMENT
// ---------------------------------------------------
// © Jérome Réaux : https://j-reaux.developpez.com - https://www.jerome-reaux-creations.fr
// ---------------------
// retourne : 1 (vrai) si le REDIMENSIONNEMENT et l'ENREGISTEMENT ont bien eu lieu, sinon rien (false)
// ---------------------// La FONCTION : fct_img_redim_deform ($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 : 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
// ------------------------
// 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 même extension (même 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 = fct_img_redim_ratio(120,80,'reppicto/','monpicto.jpg','repimage/','monimage.jpg');
// if( $deformOK == 1 ){ echo 'Redimensionnement OK !'; }
// ---------------------------------------------------
function fct_img_redim_deform( $W_fin, $H_fin, $rep_Dst, $img_Dst, $rep_Src, $img_Src )
{
	// Si certains paramètres ont pour valeur '' :
	if( empty($rep_Dst) ){ $rep_Dst = $rep_Src; } // (même répertoire)
	if( empty($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 = array('jpg','jpeg','png','gif');
		// extension fichier Source
		$extension = strtolower( pathinfo($img_Src, PATHINFO_EXTENSION) );
		// extension OK ? on continue ...
		if( in_array($extension, $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_Src;
				$H = $H_Src;
			// B- HAUTEUR fixe
			} elseif( $W_fin == 0 && $H_fin != 0 ){
				$W = $W_Src;
				$H = $H_fin;
			// C- LARGEUR fixe
			} elseif( $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 ){
				case 'jpg':
				case 'jpeg':
					$Ress_Src = imagecreatefromjpeg($rep_Src.$img_Src);
					break;
				case 'png':
					$Ress_Src = imagecreatefrompng($rep_Src.$img_Src);
					break;
				case 'gif':
					$Ress_Src = imagecreatefromgif($rep_Src.$img_Src);
					break;
			}
			// ------------------------
			// creation d une ressource-image "Dst" aux dimensions finales
			// fond noir (par défaut)
			switch($extension ){
				case 'jpg':
				case 'jpeg':
				case 'gif':
					$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); 
			// ------------------------------------------------
			$imgJPG_Quality = 75;	// 0=nul / 75=moyen / 100=meilleur (mais image plus lourde)
			$imgPNG_Quality = 7;	// 0=nul / 7=moyen / 9=meilleur (mais image plus lourde)
			// ENREGISTREMENT dans le répertoire (avec la fonction appropriee)
			switch ($extension ){ 
				case 'jpg':
				case 'jpeg':
					imagejpeg ($Ress_Dst, $rep_Dst.$img_Dst, $imgJPG_Quality);
					break;
				case 'png':
					imagepng ($Ress_Dst, $rep_Dst.$img_Dst, $imgPNG_Quality);
					break;
				case 'gif':
					imagegif ($Ress_Dst, $rep_Dst.$img_Dst);
					break;
			}
			// ------------------------
			// liberation des ressources-image
			imagedestroy ($Ress_Src);
			imagedestroy ($Ress_Dst);
			// ------------------------
		}
	}
	// -----------------------------------------------
	// retourne : true si le REDIMENSIONNEMENT et l'ENREGISTEMENT ont bien eu lieu, sinon false
	if( file_exists($rep_Dst.$img_Dst) ){ return true; }
	else { return false; }
	// -----------------------------------------------
};
?>

4. Redimensionnement physique "avec crop" (découpe)

4-A. Redimensionnement avec "crop centré"

Redimensionnement physique "crop centré"
Original-paysage Original-portrait
Original-paysage-crop Original-portrait-crop

La fonction : fct_img_redim_crop ($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
Exemple :
Sélectionnez
<?php
$cropOK = fct_img_redim_crop(120,80,'reppicto/','monpicto.jpg','repimage/','monimage.jpg');
if ($cropOK == 1) { echo 'Crop centré OK !'; }
?>
ASTUCE : Picto toujours carré
Sélectionnez
<?php
$redim = fct_img_redim_crop(0,0,$repDest,$imageDest,$repSource,$imageSource);
$redim = fct_img_redim_ratio(100,0,'','',$repDest,$imageDest);
if ($redim==true) { echo 'picto carré créé !'; }
?>
Picto toujours carré
Original-paysage-carre Original-portrait-carre
fct_img_redim_crop
Sélectionnez
<?php
// ---------------------------------------------------
// Fonction de REDIMENSIONNEMENT physique "CROP CENTRE" et ENREGISTEMENT
// ---------------------------------------------------
// © Jérome Réaux : https://j-reaux.developpez.com - https://www.jerome-reaux-creations.fr
// ---------------------
// retourne : true si le REDIMENSIONNEMENT et l'ENREGISTEMENT ont bien eu lieu, sinon false
// ---------------------
// La FONCTION : fct_img_redim_crop ($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 : 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
// ---------------------
// 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 : (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 répertoire 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 même extension (même 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 = fct_img_redim_crop(120,80,'reppicto/','monpicto.jpg','repimage/','monimage.jpg');
// if( $cropOK == =true ){ echo 'Crop centré OK !'; }
// ---------------------
function fct_img_redim_crop( $W_fin, $H_fin, $rep_Dst, $img_Dst, $rep_Src, $img_Src )
{
	$condition = 0;
	// ---------------------
	// Si certains paramètres ont pour valeur '' :
	if( empty($rep_Dst) ){ $rep_Dst = $rep_Src; } // (même répertoire)
	if( empty($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 = array('jpg','jpeg','png','gif');
		// extension fichier Source
		$extension = strtolower( pathinfo($img_Src, PATHINFO_EXTENSION) );
		// extension OK ? on continue ...
		if( in_array($extension, $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
			// ------------------------------------------------
			if( $W_fin != 0 || $H_fin != 0 ){
				// A- crop aux dimensions indiquées
				if( $W_fin != 0 && $H_fin != 0 ){
					$W = $W_fin;
					$H = $H_fin;
				// B- crop en HAUTEUR (même largeur que la source)
				} elseif( $W_fin == 0 && $H_fin != 0 ){
					$H = $H_fin;
					$W = $W_Src;
				// C- crop en LARGEUR (même hauteur que la source)
				} elseif( $W_fin != 0 && $H_fin == 0 ){
					$W = $W_fin;
					$H = $H_Src;		
				}
			} else {
				// D- crop "carre" a la plus petite dimension de l'image source
				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 ){
				case 'jpg':
				case 'jpeg':
					$Ress_Src = imagecreatefromjpeg($rep_Src.$img_Src);
					break;
				case 'png':
					$Ress_Src = imagecreatefrompng($rep_Src.$img_Src);
					break;
				case 'gif':
					$Ress_Src = imagecreatefromgif($rep_Src.$img_Src);
					break;
			}
			// ---------------------
			// creation d une ressource-image "Dst" aux dimensions finales
			// fond noir (par défaut)
			switch($extension ){
				case 'jpg':
				case 'jpeg':
				case 'gif':
					$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( $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( $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);
			// ------------------------------------------------
			$imgJPG_Quality = 75;	// 0=nul / 75=moyen / 100=meilleur (mais image plus lourde)
			$imgPNG_Quality = 7;	// 0=nul / 7=moyen / 9=meilleur (mais image plus lourde)
			// ENREGISTREMENT dans le répertoire (avec la fonction appropriee)
			switch ($extension ){ 
				case 'jpg':
				case 'jpeg':
					imagejpeg ($Ress_Dst, $rep_Dst.$img_Dst, $imgJPG_Quality);
					break;
				case 'png':
					imagepng ($Ress_Dst, $rep_Dst.$img_Dst, $imgPNG_Quality);
					break;
				case 'gif':
					imagegif ($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'ENREGISTEMENT ont bien eu lieu, sinon false
	if( $condition == 1 && file_exists($rep_Dst.$img_Dst) ){ return true; }
	else { return false; }
	// -----------------------------------------------
};
?>

4-B. Redimensionnement avec "crop forcé"

On force ici le redimensionnement aux dimensions indiquées, avec crop si nécessaire.
Si la photo est plus grande, elle sera automatiqueùent coupée.

fct_img_redim_crop_force
Sélectionnez
<?php
// ---------------------------------------------------
// fonction de REDIMENSIONNEMENT physique "EXACT" et ENREGISTEMENT
// ---------------------------------------------------
// © Jérome Réaux : https://j-reaux.developpez.com - https://www.jerome-reaux-creations.fr
// ---------------------
// => on FORCE le REDIMENSIONNEMENT à la taille indiquée
// => Si la photo est plus grande, elle est COUPEE !
// ---------------------------------------------------
function fct_img_redim_crop_force( $W_max, $H_max, $rep_Dst, $img_Dst, $rep_Src, $img_Src )
{
	// ---------------------
	if( empty($rep_Dst) ){ $rep_Dst = $rep_Src; } // (même répertoire)
	if( empty($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) )
	{ 
		// -------------------
		// dimensions de l'image source
		$img_size		 = getimagesize($rep_Src.$img_Src);
		$W_Src			 = $img_size[0]; // largeur source
		$H_Src			 = $img_size[1]; // hauteur source
		// -------------------
		// vérification des proportions de l image source par rapport a la destination
		$W_test		 = intval($H_Src*($W_max/$H_max));
		$H_test		 = intval($W_Src*($H_max/$W_max));
		// -------------------
		if( $H_Src <= $H_test ){
			// A- Redimensionnement + crop
			$redimOK	 = fct_img_redim_crop($W_test, $H_Src, $rep_Dst, $img_Dst, $rep_Src, $img_Src);		// crop en fonction de la plus petite hauteur
			$redimOK	 = fct_img_redim_ratio_force($W_max, $H_max, $rep_Dst, $img_Dst, $rep_Dst, $img_Dst);	// REDIMENSIONNEMENT proportionnel (force)
		} else {
			// B- Crop + Redimensionnement
			$redimOK	 = fct_img_redim_crop($W_Src, $H_test, $rep_Dst, $img_Dst, $rep_Src, $img_Src);		// crop en fonction de la plus petite largeur
			$redimOK	 = fct_img_redim_ratio_force($W_max, $H_max, $rep_Dst, $img_Dst, $rep_Dst, $img_Dst);	// REDIMENSIONNEMENT proportionnel (force)
		}
	}
	// -----------------------------------------------
	// retourne : true si le REDIMENSIONNEMENT et l'ENREGISTEMENT ont bien eu lieu, sinon false
	if( file_exists($rep_Dst.$img_Dst) ){ return true; }
	else { return false; }
	// -----------------------------------------------
};
?>

4-C. Redimensionnement avec "crop contain"

On force le redimensionnement pour que l'image entière "tienne" (soit "contenue") dans les dimensions indiquées.
Si la photo est plus grande, elle NE sera PAS coupée --> ajout de bords NOIRS sur les cotés.

fct_img_redim_crop_contain
Sélectionnez
<?php
// ---------------------------------------------------
// fonction de REDIMENSIONNEMENT physique "CROP EXTERIEUR" et ENREGISTEMENT
// ---------------------------------------------------
// © Jérome Réaux : https://j-reaux.developpez.com - https://www.jerome-reaux-creations.fr
// ---------------------
// => on FORCE le REDIMENSIONNEMENT à la taille indiquée
// => Si la photo est plus grande, elle n'est PAS COUPEE ! (bords NOIRS sur les cotés)
// ---------------------------------------------------
function fct_img_redim_crop_contain( $W_max, $H_max, $rep_Dst, $img_Dst, $rep_Src, $img_Src )
{
	// ---------------------
	if( empty($rep_Dst) ){ $rep_Dst = $rep_Src; } // (même répertoire)
	if( empty($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) )
	{  
		// -------------------
		// dimensions de l'image source
		$img_size	= getimagesize($rep_Src.$img_Src);
		$W_Src		= $img_size[0]; // largeur source
		$H_Src		= $img_size[1]; // hauteur source
		// -------------------
		// vérification des proportions de l image source par rapport a la destination
		$W_test		 = intval($H_Src*($W_max/$H_max));
		$H_test		 = intval($W_Src*($H_max/$W_max));
		// -------------------
		// A - Redimensionnement aux dimensions
		$redimOK	= fct_img_redim_ratio_force($W_max, $H_max, $rep_Dst, $img_Dst, $rep_Src, $img_Src);	// REDIMENSIONNEMENT proportionnel (force)
		$redimOK	= fct_img_redim_crop($W_max, $H_max, $rep_Dst, $img_Dst, $rep_Dst, $img_Dst);			// crop en fonction de la plus petite hauteur
	}
	// -----------------------------------------------
	// retourne : true si le REDIMENSIONNEMENT et l'ENREGISTEMENT ont bien eu lieu, sinon false
	if( file_exists($rep_Dst.$img_Dst) ){ return true; }
	else { return false; }
	// -----------------------------------------------
};
?>

5. "Rotation" de l'image


La fonction : fct_img_rotation( $angle=0, $bgd_color=0, $rep_Dst, $img_Dst, $rep_Src, $img_Src )

Retourne true si la ROTATION et l'ENREGISTEMENT ont bien eu lieu, sinon false

Les paramètres :
- $angle : ANGLE de ROTATION en DEGRE --> ou 0 par défaut
- $bgd_color : spécifie la couleur des zones qui seront découvertes après la rotation --> ou 0 par défaut (voir imagerotate())
- $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

Les 4 cas suivant ne nécessitent pas de définir le $bgd_color (laisser 0) :
- $angle = 0 --> pas de rotation
- $angle = 90 --> rotation de 90° vers la droite (sens des aiguilles d'une montre)
- $angle = -90 --> rotation de 90° vers la gauche (sens inverse des aiguilles d'une montre)
- $angle = 180 --> rotation de 180°
Exemple (copyright, date, ou légende de l'image)
Sélectionnez
<?php
$rotationOK = fct_img_rotation(90,0,'','','repimage/','monimage.jpg');
if( $rotationOK == true ){ echo 'Rotation OK !'; }
?>
fct_img_rotation
Sélectionnez
<?php
// ---------------------------------------------------
// fonction de ROTATION et ENREGISTEMENT
// ---------------------------------------------------
// © Jérome Réaux : https://j-reaux.developpez.com - https://www.jerome-reaux-creations.fr
// ---------------------------------------------------
// La FONCTION : fct_img_rotation( $angle=0, $bgd_color=0, $rep_Dst, $img_Dst, $rep_Src, $img_Src )
// Les paramètres :
// - $angle : ANGLE de ROTATION en DEGRE --> ou 0 par défaut
// - $bgd_color : spécifie la couleur des zones qui seront découvertes après la rotation --> ou 0 par défaut
//				 (voir imagerotate() : https://www.php.net/manual/fr/function.imagerotate.php)
// - $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 cas suivant ne nécessitent pas de définir le $bgd_color (laisser 0) :
// - $angle = 0 --> pas de rotation
// - $angle = 90 --> rotation de 90° vers la droite (sens des aiguilles d'une montre)
// - $angle = -90 --> rotation de 90° vers la gauche (sens inverse des aiguilles d'une montre)
// - $angle = 180 --> rotation de 180°
// ---------------------
// UTILISATION (exemple) :
// $rotationOK = fct_img_rotation(90,0,'','','repimage/','monimage.jpg');
// if( $rotationOK == true ){ echo 'Rotation OK !'; }
// ---------------------
function fct_img_rotation( $angle=0, $bgd_color=0, $rep_Dst, $img_Dst, $rep_Src, $img_Src )
{
	$angle					= intval($angle);
	// ---------------------
	if( empty($rep_Dst) ){ $rep_Dst = $rep_Src; } // (même répertoire)
	if( empty($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) && $angle != 0 )
	{  
		// ----------------------
		// extensions acceptées 
		$extension_allowed = array('jpg','jpeg','png','gif');
		// extension fichier Source
		$extension = strtolower( pathinfo($img_Src, PATHINFO_EXTENSION) );
		// extension OK ? on continue ...
		if( in_array($extension, $extension_allowed) )
		{
			// -------------------
			// dimensions de l'image source
			$img_size	= getimagesize($rep_Src.$img_Src);
			$W_Src		= $img_size[0]; // largeur source
			$H_Src		= $img_size[1]; // hauteur source
			// -------------------
			// creation de la ressource-image "Src" en fonction de l extension
			switch($extension ){
			case 'jpg':
			case 'jpeg':
				$Ress_Src = imagecreatefromjpeg($rep_Src.$img_Src);
				break;
			case 'png':
				$Ress_Src = imagecreatefrompng($rep_Src.$img_Src);
				break;
			case 'gif':
				$Ress_Src = imagecreatefromgif($rep_Src.$img_Src);
			  break;
			}
			// ------------------------------------------------
			// ROTATION
			$Ress_Dst		= imagerotate ($Ress_Src, $angle, $bgd_color);
			// ------------------------------------------------
			$imgJPG_Quality = 75;	// 0=nul / 75=moyen / 100=meilleur (mais image plus lourde)
			$imgPNG_Quality = 7;	// 0=nul / 7=moyen / 9=meilleur (mais image plus lourde)
			// ENREGISTREMENT dans le répertoire (avec la fonction appropriee)
			switch ($extension ){ 
			case 'jpg':
			case 'jpeg':
				imagejpeg ($Ress_Dst, $rep_Dst.$img_Dst, $imgJPG_Quality);
				break;
			case 'png':
				imagepng ($Ress_Dst, $rep_Dst.$img_Dst, $imgPNG_Quality);
				break;
			case 'gif':
				imagegif ($Ress_Dst, $rep_Dst.$img_Dst );
				break;
			}
			// ------------------------
			// liberation des ressources-image
			imagedestroy ($Ress_Src);
			imagedestroy ($Ress_Dst);
			// -------------------
		}
	}
	// -----------------------------------------------
	// retourne : true si le REDIMENSIONNEMENT et l'ENREGISTEMENT ont bien eu lieu, sinon false
	if( file_exists($rep_Dst.$img_Dst) ){ return true; }
	else { return false; }
	// -----------------------------------------------
};
?>

6. "Signature" de l'image ("watermark")

"Signature" de l'image
Original-signature-HG Original-signature-HD
Original-signature-BG Original-signature-BD
Original-signature-HC Original-signature-BC

La fonction : fct_img_watermark_texte ($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
Exemple (copyright, date, ou légende de l'image)
Sélectionnez
<?php
$texteOK = fct_img_watermark_texte('copyright : MOI','reppicto/','monpicto.jpg','repimage/','monimage.jpg','BG');
if ($texteOK == 1) { echo 'Ajout du texte OK !';  }
?>
fct_img_watermark_texte
Sélectionnez
<?php
// ---------------------------------------------------
// Fonction d'AJOUT DE TEXTE à une image et ENREGISTEMENT
// ---------------------------------------------------
// © Jérome Réaux : https://j-reaux.developpez.com - https://www.jerome-reaux-creations.fr
// ---------------------
// retourne : true si l'ajout de texte a bien été ajouté, sinon false
// ---------------------
// La FONCTION : fct_img_watermark_texte ($chaine, $rep_Dst, $img_Dst, $rep_Src, $img_Src, $position)
// Les paramètres :
// - $chaine : TEXTE a 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
// ---------------------
// ATTENTION : si le texte est TROP long, il risque d'être tronqué !
// ---------------------
// Position du texte sur l'image ( valeurs possibles) :
// $position = 'HG' --> Haut - Gauche ( valeur par défaut)
// $position = 'HD' --> Haut - Droite
// $position = 'HC' --> Haut - Centre
// $position = 'MG' --> Milieu - Gauche
// $position = 'MD' --> Milieu - Droite
// $position = 'MC' --> Milieu - Centre
// $position = 'BG' --> Bas - Gauche
// $position = 'BD' --> Bas - Droite
// $position = 'BC' --> Bas - 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 même extension (même 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 = fct_img_watermark_texte('copyright : MOI','reppicto/','monpicto.jpg','repimage/','monimage.jpg','BG');
// if( $texteOK == true ){ echo 'Ajout du texte OK !'; }
// ---------------------
function fct_img_watermark_texte( $chaine, $rep_Dst, $img_Dst, $rep_Src, $img_Src, $position )
{
	$condition = 0;
	// ---------------------
	if( empty($rep_Dst) ){ $rep_Dst = $rep_Src; } // (même répertoire)
	if( empty($img_Dst) ){ $img_Dst = $img_Src; } // (même nom)
	// ---------------------
	$position_allowed = array('HG','HD','HC','MG','MD','MC','BG','BD','BC');
	$position = strtoupper($position); // en majuscule
	if( empty($position) || !in_array($position, $position_allowed) ){ $position = 'BG'; } // par défaut
	// ---------------------
	if( file_exists($rep_Src.$img_Src) && !empty($chaine) )
	{
		// ----------------------
		// extensions acceptées 
		$extension_allowed = array('jpg','jpeg','png','gif');
		// extension fichier Source
		$extension = strtolower( pathinfo($img_Src, PATHINFO_EXTENSION) );
		// extension OK ? on continue ...
		if( in_array($extension, $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 ){
			case 'jpg':
			case 'jpeg':
			  $Ress_Dst = imagecreatefromjpeg($rep_Src.$img_Src);
			  break;
			case 'png':
			  $Ress_Dst = imagecreatefrompng($rep_Src.$img_Src);
			  break;
			case 'gif':
			  $Ress_Dst = imagecreatefromgif($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 caractères (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 défaut)
			// ---------------------
			// creation de la ressource-image "Txt" (en fonction de l extension)
			switch($extension ){
			case 'jpg':
			case 'jpeg':
			case 'png':
			case 'gif':
			  $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
			// ------------------------------------------------
			switch ($position ){ 
				case 'HG':	// Haut - Gauche
					$X_Dest = 0;
					$Y_Dest = 0;
					break;
				case 'HD':	// Haut - Droite
					$X_Dest = $W_Src - $W;
					$Y_Dest = 0;
					break;
				case 'HC':	// Haut - Centre
					$X_Dest = ($W_Src - $W)/2;
					$Y_Dest = 0;
					break;
				case 'MG':	// Milieu - Gauche
					$X_Dest = 0;
					$Y_Dest = ($H_Src - $H)/2;
					break;
				case 'MD':	// Milieu - Droite
					$X_Dest = $W_Src - $W;
					$Y_Dest = ($H_Src - $H)/2;
					break;
				case 'MC':	// Milieu - Centre
					$X_Dest = ($W_Src - $W)/2;
					$Y_Dest = ($H_Src - $H)/2;
					break;
				case 'BG':	// Bas - Gauche
					$X_Dest = 0;
					$Y_Dest = $H_Src - $H;
					break;
				case 'BD':	// Bas - Droite
					$X_Dest = $W_Src - $W;
					$Y_Dest = $H_Src - $H;
					break;
				case 'BC':	// Bas - Centre
					$X_Dest = ($W_Src - $W)/2;
					$Y_Dest = $H_Src - $H;
					break;
			}
			// ------------------------------------------------
			// 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 répertoire (en fonction de l extension)
			$imgJPG_Quality = 75;	// 0=nul / 75=moyen / 100=meilleur (mais image plus lourde)
			$imgPNG_Quality = 7;	// 0=nul / 7=moyen / 9=meilleur (mais image plus lourde)
			switch ($extension ){ 
				case 'jpg':
				case 'jpeg':
					imagejpeg ($Ress_Dst, $rep_Dst.$img_Dst, $imgJPG_Quality);
					break;
				case 'png':
					imagepng ($Ress_Dst, $rep_Dst.$img_Dst, $imgPNG_Quality);
					break;
				case 'gif':
					imagegif ($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'ENREGISTEMENT 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

Redimensionnement à l'affichage
Sélectionnez
Fonction : fct_img_redim_affichage($img_Src, $W_max, $H_max)
Exemple :
	<img alt="" src="repimg/monimage.jpg" <?php fct_img_redim_affichage('repimg/monimage.jpg', 150, 100) ?> />
Redimensionnement physique proportionnel
Sélectionnez
Fonction : fct_img_redim_ratio($W_max, $H_max, $rep_Dst, $img_Dst, $rep_Src, $img_Src)
Exemple :
<?php
	$redimOK = fct_img_redim_ratio(120,80,'reppicto/','monpicto.jpg','repimage/','monimage.jpg');
	if ($redimOK == 1) { echo 'Redimensionnement OK !'; }
?>
Redimensionnement physique non-proportionnel
Sélectionnez
Fonction : fct_img_redim_deform($W_fin, $H_fin, $rep_Dst, $img_Dst, $rep_Src, $img_Src)
Exemple :
<?php	$deformOK = fct_img_redim_deform(120,80,'reppicto/','monpicto.jpg','repimage/','monimage.jpg');
		  if ($deformOK == 1) { echo 'Redimensionnement OK !'; } ?>
Redimensionnement physique crop centré
Sélectionnez
Fonction : fct_img_redim_crop($W_fin, $H_fin, $rep_Dst, $img_Dst, $rep_Src, $img_Src)
Exemple :
<?php
	$cropOK = fct_img_redim_crop(120,80,'reppicto/','monpicto.jpg','repimage/','monimage.jpg');
	if ($cropOK == 1) { echo 'Crop centré OK !'; }
?>
Astuce - picto toujours carré avec crop
Sélectionnez
<?php
	$redim = fct_img_redim_crop(0,0,$repDest,$imageDest,$repSource,$imageSource);
	$redim = fct_img_redim_ratio(100,0,'','',$repDest,$imageDest);
	if ($redim==true) { echo 'picto carré créé !'; }
?>
Astuce - picto toujours carré déformé
Sélectionnez
<?php
	$redim = fct_img_redim_deform(100,100,$repDest,$imageDest,$repSource,$imageSource);
	if ($redim==true) { echo 'picto carré créé !'; }
?>
Signature d'une image
Sélectionnez
Fonction : fct_img_watermark_texte ($chaine, $rep_Dst, $img_Dst, $rep_Src, $img_Src, $position)
Exemple (copyright, date, ou légende de l'image) :
<?php
	$texteOK = fct_img_watermark_texte('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

news_traiter_photo
Sélectionnez
<?php
// © Jérome Réaux : https://j-reaux.developpez.com - https://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 		= fct_img_redim_ratio($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 fct_img_redim_ratio()
- enregistrer le picto dans le dossier de destination.

NB :
Par défaut, la fonction fct_img_redim_ratio() 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)

MONDOSSIER-REDIM
Sélectionnez
<?php
// FONCTIONS de redimensionnement "physique"
	include("fct_img_redim_ratio.php");
//	include("fct_img_redim_crop.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 = fct_img_redim_ratio(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. 9 commentaires Donner une note  l'article (5)

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2008 Jérôme Réaux. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Droits de diffusion permanents accordés à Developpez LLC.