Redimensionnement d'une images, gif, png, jpeg, jpg

Soyez le premier à donner votre avis sur cette source.

Snippet vu 15 002 fois - Téléchargée 23 fois

Contenu du snippet

J'éspère que ce code vous sera utile, je n'ai pas encore eu de problème avec ce code, je l'ai améliorer au fur et à mesure du temps. Elle redimenssione les images en gardant les proportions, bien sur ! Vous avez besoin de la fonction "mime_content_type" sur votre serveur pour afficher correctement l'image.

Pour simplifier le nombre de variable faites une seconde fonction pour juste un affichage ou un enregistrement, exemple :

// Voir une image
function show_image( $src, $size ) { // 2 variables, une pour la source et une pour la taile, la taille s'exprime comme ceci (100x100 ou 200x200 etc.)

return do_image( $src, '', $size, 1, 0 );
}

// Enregistré l'image
function save_image( $src, $size, $dest, $del ) { // 4 variables, la source, la taille maximun, la destination de sauvegarde, si on supprime la source (0=non, 1=oui)

return do_image( $src, $dest, $size, 0, $del );
}

// La fonction "do_image"
do_image( string filename src, string filename dest, string maxSize, int show, int del )

Pour le paramêtre "show" 1 signifie l'affiché, 0 signifie l'inverse logique. Pareils pour le paramêtre "del", 1 signie supprimé le fichier une fois convertis, 0 signe ne pas le supprimé après l'affichage ou l'enregistrement

Source / Exemple :


function do_image($src, $dest, $size, $show, $del=1) {
				
		// Extension du fichier
		$ext = strtolower( substr( strrchr( $src, '.' ), 1 ) );
		
		// Si l'extension est reconnue
		if( !in_array( $ext, array( 'jpg', 'jpeg', 'gif', 'png' ) ) ) ) {
			
			return FALSE;
		}
				
		// Propriété du fichier
		list( $width, $height, $type, $attr ) = getimagesize($src);
		
                // Contrôle du type d'image
		if( !in_array( $type, array( 1,2,3 ) ) ) {
			
			if( $del == 1 ) {
			
				unlink( $src );
			}

                  return FALSE;
		} 
		
		// Création d'une images a partir de l'original
		switch( $type ) {

			case 1: $tmp = imagecreatefromgif($src);	break;
			case 2: $tmp = imagecreatefromjpeg($src);	break;
			case 3: $tmp = imagecreatefrompng($src);	break;
						
			default : return FALSE;
		}
		
		// Infos des taillles maximum
		$size = empty( $size ) || strpos( strtolower( $size ), 'x' ) === FALSE ? 100x100 : $size;
		
		list( $max_width, $max_height ) = explode('x', $size);
		
		// Calcul des tailles proportionnelles
		if( $width > $max_width || $height > $max_height ) {
		
			if( $width >= $height ) {
										
				if( $width > $max_width ) {
				
					$width_img	= $max_width;
					$propB 	= $width/$width_img;
					$height_img = floor($height/$propB);
											
				}

				if( $height_img > $max_height ) {
					
					$height_img	= $max_height;
					$propB 	 	= $height/$height_img;
					$width_img 	= floor($width/$propB);
					
				}

			}
			else {
										
				if( $height > $max_height ) {
										
					$height_img	= $max_height;
					$propB 	= $height/$height_img;
					$width_img 	= floor($width/$propB);
											
				}

				if( $width_img > $max_width ) {
					
					$width_img	= $max_width;
					$propB 		= $width/$width_img;
					$height_img = floor($height/$propB);
					
				}
																		
			}
		}
		else {

			$width_img 	= $width;
			$height_img = $height;
		}
		
		// Création de l'image trueColor
		$img = imagecreatetruecolor($width_img, $height_img);
		
		// Copie d'un contenue vers un autre, rééchantillonnage
		if( imagecopyresampled($img, $tmp, 0, 0, 0, 0, $width_img, $height_img, $width, $height) !== false ) {
				
			// Enregistrement ou affichage
			if( $show != 1 ) {
												
				switch( $type ) {
								
					case 1 : imagegif($img, $dest); 		break;
					case 2 : imagejpeg($img, $dest, 100); 	break;
					case 3 : imagepng($img, $dest);		break;
		
					default: return FALSE;
				}
					
			}
			else {
				
				@header("Content-type: ". mime_content_type( $src ) );	
			
				switch( $type ) {
								
					case 1 : imagegif($img); 			exit;	break;
					case 2 : imagejpeg($img, '', 100); 	      exit; break;
					case 3 : imagepng($img); 			exit;	break;
		
					default: return FALSE;
				}
								
			}	
		}
					
			// On supprime $del est égal à 1
			if( $del == 1 ) 			
				unlink($src);
						
			// Suppression des variables
			unset($img, $tmp, $src);
			
	}

Conclusion :


Laissez moi des critiques avec des solutions, si il n'y pas de solutions au problème c'est une critique qui n'est pas utile.

A voir également

Ajouter un commentaire Commentaires
Messages postés
1
Date d'inscription
vendredi 27 avril 2007
Statut
Membre
Dernière intervention
13 septembre 2007

Salut,

j'ai télèchargé le script pour voir, mais il y a une erreur à la ligne :

$size empty( $size ) || strpos( strtolower( $size ), 'x' ) FALSE ? 100x100 : $size;

@+
Messages postés
10
Date d'inscription
jeudi 5 août 2004
Statut
Membre
Dernière intervention
20 décembre 2006

Lol do_image est une function ! Juste ! Elle n'est pas dans une class, donc pas de public avant. Je l'avais dans une class pour ma part, erreur de correction...
Messages postés
10
Date d'inscription
jeudi 5 août 2004
Statut
Membre
Dernière intervention
20 décembre 2006

Public pk, parce que c'est bien clair. On sait de quoi on parle, on pourrait ne rien mettre oui, automatiquement cela est considéré en public je sais. C'est histoire de bien faire les choses.

// Citation
D'ailleur tu as une petit erreur dans cette même condition qui ne renvoie false que si $del == 1..

Merci pour l'interrogation du type qui ne renvoie FALSE que si $del est égal à 1, je n'avais pas remarqué.

// Citation
Tu fais deux fois la vérification de l'image... une fois par rapport à l'extension et une seconde fois pas rapport au type retourné par getimagesize()... c'est inutile le second test suffit... et plutot que de faire une condition à part tu pourrais faire... vu que tu utilise un switch...

Oui je fais 2 fois le contrôle du type de l'image, une fois par l'extension et une fois par le type même de l'image, je trouve nécessaire en cas de problème de savoir où chercher, c'est totalement volontaire !

// Citation
Sinon je trouve que l'utilisation de mime_content_type() n'est pas justifiée et limite la portabilité du script pour pas grand chose... autant faire...

Pour les headers c'est un petit détail je trouve mais je prend note.


// Citation
par contre il pourrait être bien de rajouter...
if(!empty($show) && headers_sent())
return false;

Par contre je ne comprends pas pourquoi contrôler que les headers sont envoyés vu que c'est un enregistrement ? Cela peut-être fait avant ou après les headers envoyés

// Citation
Utilise empty() plutot que $maVar == 1 ou $maVar != 1

Tu me dis utilise plustot cette fonction, j'ai eu pas mal d'erreur du à cette fonction que je n'apprècie pas beaucoup et j'ai remarqué que d'autres sources contrôle toujours avec une comparaison ($maVar == 1 | $maVar !=1 ) et la fonction empty() mais jamais seul. Enfin cela reste un avis personnel peut-etre.


// Citation
Pour finir ton unset($img, $tmp, $src); à la fin est totalement inutile vu que les variables sont locales php les supprime automatiquement à la fin de l'éxécution de la fonction... .. .

Ca c'est du folklore ! C'est vrai mais j'aime bien supprimer ce que je fait une fois terminé, c'est une assurance qui ne sert à rien sûrement.

Merci pour ta critique très objectives
Messages postés
1293
Date d'inscription
mardi 9 novembre 2004
Statut
Membre
Dernière intervention
21 mai 2015

Zut erreurs de frappe dans mon commentaire précédant...

if(!empty($del)) et non if(!empty($del) et il faut virer le...

# @header("Content-type: ". mime_content_type( $src ) );

@ tchaOo°
Messages postés
1293
Date d'inscription
mardi 9 novembre 2004
Statut
Membre
Dernière intervention
21 mai 2015

Uhm... pourquoi un public devant la déclaration de la fonction... c'est inutile vu que c'est une fonction... .. .

Sinon le in_array()/explode est un peu inutile autant faire...

if(!in_array($type, array(1,2,3)))

voir même...

if($type > 3)
{
if(!empty($del)
unlink($src);

return false;
}

D'ailleur tu as une petit erreur dans cette même condition qui ne renvoie false que si $del == 1...

Tu fais deux fois la vérification de l'image... une fois par rapport à l'extension et une seconde fois pas rapport au type retourné par getimagesize()... c'est inutile le second test suffit... et plutot que de faire une condition à part tu pourrais faire... vu que tu utilise un switch...

switch($type)
{
case 1: $tmp = imagecreatefromgif($src); break;
case 2: $tmp = imagecreatefromjpeg($src); break;
case 3: $tmp = imagecreatefrompng($src); break;

default:
if(!empty($del)
unlink($src);

return false;
}

Sinon je trouve que l'utilisation de mime_content_type() n'est pas justifiée et limite la portabilité du script pour pas grand chose... autant faire...

# @header("Content-type: ". mime_content_type( $src ) );

switch($type)
{
case 1:
header('Content-type: image/gif');
imagegif($img);
exit();
break;

case 2:
header('Content-type: image/jpeg');
imagejpeg($img, '', 100);
exit();
break;

case 3:
header('Content-type: image/png');
imagepng($img);
exit();
break;

}

par contre il pourrait être bien de rajouter...

if(!empty($show) && headers_sent())
return false;

Afin de vérifier si les header sont déja envoyé et si de ce fait il sera possible d'afficher l'image ou non... .. .

Utilise empty() plutot que $maVar == 1 ou $maVar != 1

Pour finir ton unset($img, $tmp, $src); à la fin est totalement inutile vu que les variables sont locales php les supprime automatiquement à la fin de l'éxécution de la fonction... .. .

Voila dans les grandes lignes... .. .

@ tchaOo°
Afficher les 6 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (GNVA Dfx)