Miniature sous contrainte optimisée au maximum

Soyez le premier à donner votre avis sur cette source.

Snippet vu 7 443 fois - Téléchargée 29 fois

Contenu du snippet

Je cherchais à faire des miniatures devant être affichées dans des tableaux, donc elles ne devaient pas dépasser X pixel de largeur et Y de hauteur.

J'ai souvent vu des sources faisant cela à l'aide d'un coefficient réducteur fixe (exemple: miniature = 1/3 de la vraie photo).

Alors voilà cette petite fonction qui optimise au mieux les dimensions de l'image passée en paramètre aux limites souhaitées.

Source / Exemple :


function MakeThumb($img,$maxX,$maxY) {
	
	// Récupération des infos sur l'image
	$TImage = GetImageSize($img);
	// Rapport initial: aucune réduction
	$rapport = 1;

	// Si la largeur de l'image est supérieure à la limite
	if ($TImage[0] > $maxX)
		// Tant que la largeur réduite est supérieure à la limite
		while ($TImage[0] / $rapport > $maxX)
			// Augmentation de la réduction
			$rapport = $rapport + 0.5;

	// Assignation de la largeur finale
	$xF = $TImage[0] / $rapport;

	// Si la hauteur de l'image est supérieure à la limite
	// Si non, le rapport est le même que celui utilisé pour la largeur
	if ($TImage[1] > $maxY)
		// Tant que la hauteur réduite est supérieure à la limite
		while ($TImage[1] / $rapport > $maxY)
			// Augmentation de la réduction
			$rapport = $rapport + 0.5;

	// Assignation de la hauteur finale
	$yF = $TImage[1] / $rapport; 

	// Récupération du handle de l'image selon son format
	switch($TImage[2]) {
		
		case 1:
		$imageF = ImageCreateFromGIF($img);
		break;
		
		case 2:
		$imageF = ImageCreateFromJPEG($img);
		break;
		
		case 3:
		$imageF = ImageCreateFromPNG($img);
		break;
	}
	
	// Création de la miniature
	$thumbF = ImageCreateTrueColor($xF,$yF);

	// Compatibilité: ImageCopyResized($thumbF,$imageF,0,0,0,0,$xF,$yF,$TImage[0],$TImage[1]);
	ImageCopyResampled($thumbF,$imageF,0,0,0,0,$xF,$yF,$TImage[0],$TImage[1]);
	
	// Envoie de l'image au navigateur selon son format
	switch($TImage[2]) {
		
		case 1:
		ImageGIF($thumbF,'images/mini_'.SubStr($img,StrPos($img,'/') + 1), 60);
		break;
		
		case 2:
		ImageJPEG($thumbF,'images/mini_'.SubStr($img,StrPos($img,'/') + 1), 60);
		break;
		
		case 3:
		ImagePNG($thumbF,'images/mini_'.SubStr($img,StrPos($img,'/') + 1), 60);
		break;
	}

	// Libération de la mémoire
	ImageDestroy($thumbF);
	ImageDestroy($imageF);
}

Conclusion :


Exemple: MakeThumb('images/maphoto.jpg',200,150)

/!\ Modifiez les chemins de vos images

Testé avec succès :p

Un commentaire fait toujours plaisir ;)

En espérant vous avoir un peu aidé...

PyRoFlo

Tout sur la pyrotechnie - http://www.abcpyro.com

A voir également

Ajouter un commentaire Commentaires
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 9
9 févr. 2004 à 19:13
Salut !

Voici le code que j'utilise pour mon site :


$image="photos/1.jpg"; //EXEMPLE D'IMAGE
if (file_exists($image))
{
list($width, $height, $type, $attr) = getimagesize("$image");
if (($width)>100) //SI L'IMAGE FAIT PLUS DE 100PX de LARGE
{
$contenu.='
';
}
else
{
$contenu.='
';
}
}


Facile ensuite de le transformer en fonction

a +
pyroflo Messages postés 323 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 17 mai 2005
9 févr. 2004 à 19:22
Salut,

tu ne crées pas de miniature, tu modifies seulement l'affichage dans le tag donc l'image est chargée entièrement même si tu l'affiches 6 fois plus petite...

Tu vois le truc ?

Imagines une galerie de 20 * 20ko !
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 9
9 févr. 2004 à 19:27
Désolé j'ai pas regardé le code en détail mais juste le texte : "Je cherchais à faire des miniatures devant être affichées dans des tableaux, donc elles ne devaient pas dépasser X pixel de largeur et Y de hauteur."

C'est pour ça je n'ai pas approfondi. Tu réduis la taille de l'image et ensuite tu la redimensionnes. Ok Ok

a +
pyroflo Messages postés 323 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 17 mai 2005
9 févr. 2004 à 19:28
Y a pas de soucis ;p
psyjc Messages postés 182 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 18 avril 2008
10 févr. 2004 à 10:52
hum
le rapport hauteur/largeur ne semble pas etre conservé!


j'utilise ca:


$IMAGE_TN_SIZE = 80 // Taille maximal a ne pas depassé (largeur ou hauteur)

$handle = @imagecreatefromjpeg($relatif_link);
$x=imagesx($handle);
$y=imagesy($handle);
//echo "X:$x | Y:$y
";
# 100
if($x>$y){ # |-------------|
$max=$x; # +-------------+ - -
$min=$y; # | | |
} # | | |
if($x<=$y){ # | img | |100
$max=$y; # | | |
$min=$x; # | | |
} # +-------------+ - -

if($max==$x){
$qq=$max/$IMAGE_TN_SIZE;
}

if($max==$y){
$qq=$max/$IMAGE_TN_SIZE;
}

$dest_x=$x/$qq;
$dest_y=$y/$qq;


if($dest_x > $x) {
$dest_x = $x;
$dest_y = $y;
}


$dst_img = imageCreatetruecolor($dest_x,$dest_y);


imagecopyresized($dst_img, $handle, 0, 0, 0, 0,$dest_x, $dest_y, $x, $y);

imagejpeg($dst_img,'', $IMAGE_TN_COMPRESSION);
imagedestroy($handle);
imagedestroy($dst_img);

qui marche impec : demo ici : http://jcjcjcjc.free.fr/server/

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.