Fonction générique de redimensionnement d'image

Soyez le premier à donner votre avis sur cette source.

Vue 10 524 fois - Téléchargée 715 fois

Description

Ce code est très simple : on lui passe une image GIF, JPG ou PNG (dans le même répertoire, je n'ai pas voulu faire complexe), une largeur, une hauteur, et il crée l'image redimensionnée préfixé par 'thumb_'.

La nouveauté, un code relativement court grâce à create_function () pour créer dynamiquement la bonne fonction selon le type de l'image.

A modifier selon vos désirs (je le répête, je suis allé au plus simple).

USAGE :
imageResize (string fileName, array KEEP_PROPORTIONS)
string filename => nom du fichier image à redimensionner
optionnel array KEEP_PROPORTION => Tableau de 2 ou 3 entrées, avec pour la 1ère, une des chaînes suivantes :
'DO_NOT_KEEP_PROPORTIONS', 'KEEP_PROPORTIONS_ON_WIDTH', 'KEEP_PROPORTIONS_ON_HEIGHT', 'KEEP_PROPORTIONS_ON_BIGGEST', 'KEEP_PROPORTIONS_ON_SMALLEST'
et pour la 2de, un entier VAL. Cet entier déterminera la taille en pixel sur laquelle la fonction se calera.
Si on a choisi DO_NOT_KEEP_PROPORTIONS, une 3ème valeur est nécessaire. Dans ce cas, la 2de valeur représentera la nouvelle largeur, et la 3ème la nouvelle hauteur.
'DO_NOT_KEEP_PROPORTIONS' => largeur = VAL1, hauteur = VAL2.
'KEEP_PROPORTIONS_ON_WIDTH' => largeur = VAL, et hauteur déterminée en fonction.
'KEEP_PROPORTIONS_ON_HEIGHT' => hauteur = VAL, et largeur déterminée en fonction.
'KEEP_PROPORTIONS_ON_BIGGEST' => plus grande valeur entre hauteur et largeur = VAL? l'autre est déterminée en fonction.
'KEEP_PROPORTIONS_ON_SMALLEST' => plus petite valeur entre hauteur et largeur = VAL? l'autre est déterminée en fonction.
Dans mon exemple, je définis à 25 pixels le plus grand côté. Pour une image faisant à l'origine 640*480, la largeur sera fixée à 25, et la hauteur déduite pour conserver les proprotions.

Source / Exemple :


<?php
function imageResize ($sFileNameFrom, $sFileNameTo, $KEEP_PROPORTIONS) {
	$aProportions = array ('DO_NOT_KEEP_PROPORTIONS', 'KEEP_PROPORTIONS_ON_WIDTH', 'KEEP_PROPORTIONS_ON_HEIGHT', 'KEEP_PROPORTIONS_ON_BIGGEST', 'KEEP_PROPORTIONS_ON_SMALLEST');
	if (!file_exists ($sFileNameFrom) || !is_array ($KEEP_PROPORTIONS) || empty ($KEEP_PROPORTIONS)) {
		return false;
	} else {
		$aImg = @getimagesize ($sFileNameFrom);
		if (false === $aImg) {
			return false;
		} else {
			$aTypes = array (1 => 'gif', 2 => 'jpeg', 3 => 'png');
			if (!in_array ($aImg[2], array_keys ($aTypes))) {
				return false;
			} else {
				if (!in_array ($KEEP_PROPORTIONS[0], $aProportions)) {
					return false;
				}
				$iCmpt = count ($KEEP_PROPORTIONS);
				if (!empty ($KEEP_PROPORTIONS) && is_array ($KEEP_PROPORTIONS) && ($iCmpt >= 2) && is_int ($KEEP_PROPORTIONS[1])) {
					switch ($KEEP_PROPORTIONS[0]) {
						case 'KEEP_PROPORTIONS_ON_WIDTH' :
							$width = $KEEP_PROPORTIONS[1];
							$height = round ($aImg[1] / (round ($aImg[0]/$KEEP_PROPORTIONS[1])));
							break;
						case 'KEEP_PROPORTIONS_ON_HEIGHT' :
							$height = $KEEP_PROPORTIONS[1];
							$width = round ($aImg[0]/ (round ($aImg[1]/$KEEP_PROPORTIONS[1])));
							break;
						case 'KEEP_PROPORTIONS_ON_BIGGEST' :
							if ($aImg[0] >= $aImg[1]) {
								$width = $KEEP_PROPORTIONS[1];
								$height = round ($aImg[1] / (round ($aImg[0]/$KEEP_PROPORTIONS[1])));
							} else {
								$height = $KEEP_PROPORTIONS[1];
								$width = round ($aImg[0] / (round ($aImg[1]/$KEEP_PROPORTIONS[1])));
							}
							break;
						case 'KEEP_PROPORTIONS_ON_SMALLEST' :
							if ($aImg[0] <= $aImg[1]) {
								$width = $KEEP_PROPORTIONS[1];
								$height = round ($aImg[1] / (round ($aImg[0]/$KEEP_PROPORTIONS[1])));
							} else {
								$height = $KEEP_PROPORTIONS[1];
								$width = round ($aImg[0] / (round ($aImg[1]/$KEEP_PROPORTIONS[1])));
							}
							break;
						case 'DO_NOT_KEEP_PROPORTIONS':
							if ($iCmpt !== 3 || !is_int ($KEEP_PROPORTIONS[2])) {
								return false;
							}
							$width = $KEEP_PROPORTIONS[1];
							$height = $KEEP_PROPORTIONS[2];
							break;
					}
				}
				$getImg = create_function ('$sFileNameFrom', 'return @imagecreatefrom'.$aTypes[$aImg[2]].'($sFileNameFrom);');
				$saveImg = create_function ('$img, $sFileNameTo', 'return @image'.$aTypes[$aImg[2]].'($img, $sFileNameTo);');
				$im = $getImg ($sFileNameFrom);
				$image_p = imagecreatetruecolor($width, $height);
				imagecolortransparent ($image_p, 0);
				imagecopyresampled($image_p, $im, 0, 0, 0, 0, $width, $height, $aImg[0], $aImg[1]);
				if ($saveImg ($image_p, $sFileNameTo)) {
					return true;
				} else {
					return false;
				}
			}
		}
	}
}
imageResize ('transparent.gif', 'thumb_transparent.gif', array ('DO_NOT_KEEP_PROPORTIONS', 100, 100));
?>

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
6
Date d'inscription
mardi 18 mai 2004
Statut
Membre
Dernière intervention
7 juin 2007

J'ai un petit problème avec ce code, je l'utilisait dans quelques'uns des sites que j'ai fait, sans aucun soucis. Seulement sur le dernier en date, je ne comprends pas ce qu'il se passe, l'image est bien uploadée, mais aucune redimension n'est effectuée, ni pour l'image en grande taille, ni pour la création de la miniature.
La différence entre ces sites, c'est seulement l'hébergeur, le code, même identique, ne fonctionne pas sur 1and1, alors qu'il me semble que les mêmes fonctions php soient activées.
Si quelqu'un possède la réponse ou juste un petit bout...
Merci d'avance.
Messages postés
63
Date d'inscription
jeudi 30 septembre 2004
Statut
Membre
Dernière intervention
18 juillet 2008

Personnellement, je trouve qu'il manque des commentaires dans cette source.
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
22
Bon...contacte moi par MP, je te file mon email et tu m'envoies ton image.
Je testerai sur mon serveur.
Messages postés
22
Date d'inscription
mardi 13 juin 2006
Statut
Membre
Dernière intervention
22 septembre 2008

J'ai aussi essayé de recopier le ligne :
imageResize ('transparent.gif', 'thumb_transparent.gif', array ('DO_NOT_KEEP_PROPORTIONS', 100, 100));
et de nommer une transparent.gif que j'ai placée dans le répertoire ou se trouve ma fonction, le résultat est le même.
Messages postés
22
Date d'inscription
mardi 13 juin 2006
Statut
Membre
Dernière intervention
22 septembre 2008

Réctification : que je mette n'importe quoi dans mon echo après $im = $getImg ($sFileNameFrom); rien ne s'affiche.
Je n'ai pas encore mis mon site sur mon serveur, j'utilise easyphp, ça peut venir de ça peut-être ?
a+
Afficher les 32 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.