begin process at 2008 07 20 02:40:55
1 213 102 membres
25 nouveaux aujourd'hui
14 166 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

MINIATURISATION D'IMAGE V2


Information sur la source

Catégorie :Graphique Classé sous : miniaturisation, image, gd, redimensionnement, fonction Niveau : Initié Date de création : 17/06/2006 Vu / téléchargé: 6 055 / 830

Note :
9,17 / 10 - par 6 personnes
9,17 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (19)
Ajouter un commentaire et/ou une note

Description

Fonction de redimensionnement d'image (+ sauvegarde si besoin est), un peu plus performante que la derniere :) Je compte encore l'optimiser par la suite mais la c'est deja pas mal je pense, elle retravaille l'image et elle le fait bien donc pas de soucis =)

Source

  • <?php
  • function mini ($xmax,$ymax,$dossier,$img,$name,$fond_couleur) {
  • /*
  • $xmax => largeur maximale de l'image
  • $ymax => hauteur maximale de l'image
  • => soit une taille en px soit 'none' pour dire qu'on veut garder la même
  • $dossier => dossier dans lequel doit être créé la miniature : format dossier/ (ne pas oublier le / )
  • $img => l'image à miniaturiser
  • $name => le nom de l'image
  • $fond_couleur => couleur de fond de l'image au format hexadecimal RRR-VVV-BBB
  • */
  • // Types d'images utilisés pour le 'switch' un peu plus loin
  • define('FORMAT_GIF',1);
  • define('FORMAT_JPEG',2);
  • define('FORMAT_PNG',3);
  • // dimensions critiques
  • define('XMIN',0);
  • define('YMAX',1000);
  • define('XMIN',0);
  • define('XMAX',1000);
  • // dimensions par défaut
  • define('DEFAUTX',150);
  • define('DEFAUTY',150);
  • // on essaie d'ouvrir le fichier uniquement en lecture (pour être sur qu'il existe) :
  • if(@$file=fopen($img,'r')) {
  • // si le fichier a bien été ouvert, on verifie que c'est bien une image
  • // getimagesize renvoie plusieurs infos de l'image (dimensions, type etc...) et FALSE
  • // si le fichier n'est pas une image :
  • if(list($largeur,$hauteur,$extention) = @getimagesize(htmlentities($img))) {
  • // si c'est bien une image, on teste les valeurs voulues pour la miniature
  • // largeur
  • if((isset($xmax) && !empty($xmax) && $xmax>XMIN && $xmax<XMAX)) {
  • $xm=$xmax;
  • } elseif($xmax=='none') {
  • // si la largeur n'est pas definie on garde la même
  • $xm=$largeur;
  • } else {
  • $xm=DEFAUTX; // largeur par defaut (au cas ou)
  • }
  • // hauteur
  • if((isset($ymax) && !empty($ymax) && $ymax>YMIN && $ymax<YMAX)) {
  • $ym=$ymax;
  • } elseif($ymax=='none') {
  • // si la hauteur n'est pas definie on garde la même
  • $ym=$hauteur;
  • } else {
  • $ym=DEFAUTY; // largeur par defaut (au cas ou)
  • }
  • // creation de la miniature :
  • // test de l'extention :
  • if(in_array($extention,array(1,2,3))) {
  • // si l'extention est bonne on continue
  • switch($extention) {
  • case FORMAT_GIF: // GIF
  • $im=imagecreatefromgif($img) or die('probleme de librairie');
  • break;
  • case FORMAT_JPEG: //JPEG
  • $im=imagecreatefromjpeg($img) or die('probleme de librairie');
  • break;
  • case FORMAT_PNG: // PNG
  • $im=imagecreatefrompng($img) or die('probleme de librairie');
  • break;
  • }
  • // test des dimensions :
  • // si l'image est trop large ou trop haute
  • if($largeur>$xm || $hauteur>$ym) {
  • // coeficient de proportionnalité (pour garder les proportions dans la reduction de l'image)
  • // la reduction ne se fait que pour des dimensions finales entieres donc on arrondis le resultat
  • if ($largeur && ($largeur > $hauteur)) {
  • // image plus large que haute
  • $nhauteur = ceil(($hauteur * $xm)/$largeur);
  • $nlargeur=$xm;
  • } else {
  • // image plus haute que large
  • $nlargeur = ceil(($largeur *$ym)/$hauteur);
  • $nhauteur=$ym;
  • }
  • } elseif($largeur<$xm || $hauteur<$ym) {
  • if($largeur<=$xm) {
  • $nlargeur=$largeur;
  • $xm=$largeur;
  • }
  • if($hauteur<=$ym) {
  • $nhauteur=$hauteur;
  • $ym=$hauteur;
  • }
  • } else {
  • $nlargeur=$largeur;
  • $nhauteur=$hauteur;
  • }
  • // calcul de la position de l'image sur la miniature (centrée si l'image finale est plus grande)
  • $py=($ym-$nhauteur)/2;
  • $px=($xm-$nlargeur)/2;
  • // miniaturisation
  • // image sur fond de couleur definie par l'utilisateur :
  • if(isset($fond_couleur) && !empty($fond_couleur)) {
  • $src=imagecreatetruecolor($xm,$ym) or die('probleme de librairie');
  • list($fond_rouge,$fond_vert,$fond_bleu) = explode('-',$fond_couleur);
  • $fond=imagecolorallocate($src,$fond_rouge,$fond_vert,$fond_bleu) or die('probleme de librairie');
  • // on dessine un rectangle de la couleur choisit par l'utilisateur (couleur de fond)
  • imagefilledrectangle($src,0,0,$xm,$ym,$fond) or die('probleme de librairie');
  • // on créé la miniature
  • imagecopyresampled($src,$im,$px,$py,0,0,$nlargeur,$nhauteur,$largeur,$hauteur) or die('probleme de librairie');
  • } else {
  • // Aucune couleur de fond definie!
  • return false;
  • }
  • } else {
  • //L'image doit être au format GIF, JPEG ou PNG !
  • return false;
  • }
  • } else {
  • // Le fichier n'est pas une image !
  • return false;
  • }
  • } else {
  • return false;
  • }
  • // dans le cas ou vous voudriez sauvegarder puis afficher, ne pas inverser cet ordre !
  • // sauvegarde de l'image :
  • imagepng($src,$dosier.$name.'.png');
  • // affichage de l'image
  • header('content-type: image/png');
  • return @imagepng($src);
  • }
  • ?>
<?php
function mini ($xmax,$ymax,$dossier,$img,$name,$fond_couleur) {
	/*
	$xmax => largeur maximale de l'image
	$ymax => hauteur maximale de l'image
	=> soit une taille en px soit 'none' pour dire qu'on veut garder la même
	$dossier => dossier dans lequel doit  être créé la miniature : format dossier/ (ne pas oublier le / )
	$img => l'image à miniaturiser
	$name => le nom de l'image
	$fond_couleur => couleur de fond de l'image au format hexadecimal RRR-VVV-BBB
	*/
	
	// Types d'images utilisés pour le 'switch' un peu plus loin
	define('FORMAT_GIF',1);
	define('FORMAT_JPEG',2);
	define('FORMAT_PNG',3);
	
	// dimensions critiques
	define('XMIN',0);
	define('YMAX',1000);
	define('XMIN',0);
	define('XMAX',1000);
	
	// dimensions par défaut
	define('DEFAUTX',150);
	define('DEFAUTY',150);
	
	// on essaie d'ouvrir le fichier uniquement en lecture (pour être sur qu'il existe) :
	if(@$file=fopen($img,'r')) {
		// si le fichier a bien été ouvert, on verifie que c'est bien une image
		// getimagesize renvoie plusieurs infos de l'image (dimensions, type etc...) et FALSE
		// si le fichier n'est pas une image :
		if(list($largeur,$hauteur,$extention) = @getimagesize(htmlentities($img))) {
			// si c'est bien une image, on teste les valeurs voulues pour la miniature
			// largeur
			if((isset($xmax) && !empty($xmax) && $xmax>XMIN && $xmax<XMAX)) {
				$xm=$xmax;
			} elseif($xmax=='none') {
			// si la largeur n'est pas definie on garde la même
				$xm=$largeur;
			} else {
				$xm=DEFAUTX; // largeur par defaut (au cas ou)
			}
			// hauteur
			if((isset($ymax) && !empty($ymax) && $ymax>YMIN && $ymax<YMAX)) {
				$ym=$ymax;
			} elseif($ymax=='none') {
			// si la hauteur n'est pas definie on garde la même
				$ym=$hauteur;
			} else {
				$ym=DEFAUTY; // largeur par defaut (au cas ou)
			}
			// creation de la miniature :
			// test de l'extention :
			if(in_array($extention,array(1,2,3))) {
				// si l'extention est bonne on continue
				switch($extention) {
					case FORMAT_GIF: // GIF
						$im=imagecreatefromgif($img) or die('probleme de librairie');
					break;
					case FORMAT_JPEG: //JPEG
						$im=imagecreatefromjpeg($img) or die('probleme de librairie');
					break;
					case FORMAT_PNG: // PNG
						$im=imagecreatefrompng($img) or die('probleme de librairie');
					break;
				}
				// test des dimensions :
				// si l'image est trop large ou trop haute
				if($largeur>$xm || $hauteur>$ym) {
					// coeficient de proportionnalité (pour garder les proportions dans la reduction de l'image)
					// la reduction ne se fait que pour des dimensions finales entieres donc on arrondis le resultat
					if ($largeur && ($largeur > $hauteur)) {
						// image plus large que haute
						$nhauteur = ceil(($hauteur * $xm)/$largeur);
						$nlargeur=$xm;
					} else {
						// image plus haute que large
						$nlargeur = ceil(($largeur *$ym)/$hauteur);
						$nhauteur=$ym;
					}
				} elseif($largeur<$xm || $hauteur<$ym) {
					if($largeur<=$xm) {
						$nlargeur=$largeur;
						$xm=$largeur;
					}
					if($hauteur<=$ym) {
						$nhauteur=$hauteur;
						$ym=$hauteur;
					}
				} else {
					$nlargeur=$largeur;
					$nhauteur=$hauteur;
				}
				// calcul de la position de l'image sur la miniature (centrée si l'image finale est plus grande) 
				$py=($ym-$nhauteur)/2;
				$px=($xm-$nlargeur)/2;
				
				// miniaturisation
				
				// image sur fond de couleur definie par l'utilisateur :
				if(isset($fond_couleur) && !empty($fond_couleur)) {
					$src=imagecreatetruecolor($xm,$ym) or die('probleme de librairie');
					
					list($fond_rouge,$fond_vert,$fond_bleu) = explode('-',$fond_couleur);
					$fond=imagecolorallocate($src,$fond_rouge,$fond_vert,$fond_bleu) or die('probleme de librairie');
					
					// on dessine un rectangle de la couleur choisit par l'utilisateur (couleur de fond)
					imagefilledrectangle($src,0,0,$xm,$ym,$fond) or die('probleme de librairie');
					
					// on créé la miniature
					imagecopyresampled($src,$im,$px,$py,0,0,$nlargeur,$nhauteur,$largeur,$hauteur) or die('probleme de librairie');
				} else {
					// Aucune couleur de fond definie!
					return false;
				}
			} else {
				//L'image doit être au format GIF, JPEG ou PNG !
				return false;
			}
		} else {
			// Le fichier n'est pas une image !
			return false;
		}
	} else {
		return false;
	}
	// dans le cas ou vous voudriez sauvegarder puis afficher, ne pas inverser cet ordre !
	// sauvegarde de l'image :
	imagepng($src,$dosier.$name.'.png');
	
	// affichage de l'image
	header('content-type: image/png');
	return @imagepng($src);

}
?>

Conclusion

Rien à ajouter pour l'instant, comme je l'ai dit je vais la modifier par la suite pour par exemple ne pas ecrase une image deja existante au cas ou, on verra par la suite :)
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

  • signaler à un administrateur
    Commentaire de BenXbox le 18/06/2006 10:46:54

    Salut Palleas_44,
    Je voudrais savoir pourquoi tu ne fais pas ta source pour plus t'extension d'images : exemple le bmp.
    Et j'aurais voulue savoir comment faire pour faire marcher ton script avec un dossier d'images sans extensions.
    Merci d'avance.

  • signaler à un administrateur
    Commentaire de Palleas_44 le 18/06/2006 11:07:45

    Pour le bmp c'est plus compliqué puisqu'il n'y a pas vraiment de fonction comme celles utilisées ici genre imagecreatefrombmp() =)
    Mais c'est pas bete ca ^o) j'vais m'y atteler :p

    Sinon je vois pas trop ce que tu veux dire pour un dossier d'images sans extentions ^o)

  • signaler à un administrateur
    Commentaire de BenXbox le 18/06/2006 11:16:14

    Bas enfaite mon site de rencontre enregistre les images dans le dossier « photos » sans leur extensions  lors de l’upload exemple :
    Avant = BenXbox.JPG
    Après = BenXbox
    Maintenant que j’ai plus de 5000 photos dans ce type d’extensions « jpeg, jpg, png, gif, bmp » je ne sais pas comment faire pour les réduire avec la lib GD.
    Je pense que ton script est pas mal pour faire ce que je veux, mais il faudrait ajouter le bmp et pouvoir retrouver les extensions des images du dossier « photos ».
    Merci d’avance.

  • signaler à un administrateur
    Commentaire de TheSin le 18/06/2006 13:32:53

    Bin moi sur le BMP je me demande bien comment on peut faire, ne serait-ce que pour le charger avec GD ...
    Faudrait ouvrir le fichier en binaire puis l'analyser et ajouter chaque pixel correctement je pense, mais bon, je pense que ca peut être assez lourd en PHP :(
    Sinon, sympa ton nouveau code Palleas_44 ;-)

  • signaler à un administrateur
    Commentaire de webdeb le 19/06/2006 12:51:23

    Yep l'ami !

    Tu vas bien ? Ca y'est tu t'es décidé à poster ta source ^^ Sincèrement elle est classe mais ce qu'il serait bien d'essayer c'est de l'implémenter dans une fonction ou bien dans une classe objet.

    ++

    Hugo.

    PS : Je te mets 9/20 :)

  • signaler à un administrateur
    Commentaire de gborras le 19/06/2006 12:59:59

    je ne sais pas pour la lecture du bmp non plus, par contre pour identifier le type des fichiers le plus simple reste de lire les premiers octets pour avoir la signature du type de fichier
    BPM  : commencent par BM en général
    JPEG : JFIF a partir du 6eme octet ......JFIF....
    GIF  : commencent par GIF
    ...

  • signaler à un administrateur
    Commentaire de malalam le 19/06/2006 13:03:09 administrateur CS

    PS: heureusement que les nots sont sur 10, sinon il t'aurait descendu, ton pote... ;-)
    A part ça, c'est pas mal. Sauf peut-être la sauvegarde...y a que du png.

  • signaler à un administrateur
    Commentaire de NeoZer0 le 20/06/2006 10:15:22

    Pour le BMP faut savoir manipuler les fichiers binaire et créer ca propre fonction:
    voila un peut d'info sur le format: http://fr.wikipedia.org/wiki/BMP_%28format%29
    et les fonctions pack et unpack de php peuvent être très utilent
    en manipulant le binaire (et en connaissant la structure du format) on peut manipuler plein de choses

  • signaler à un administrateur
    Commentaire de masternico le 22/06/2006 09:36:41

    En fouillant un peut sur le site de fr3.php.net, j'y ai trouvé la fontion imagewbmp dont voici la fiche technique:

    ***********************************************
    ***********************************************

    bool imagewbmp ( resource image [, string filename [, int foreground]] )


    imagewbmp() crée l'image WBMP dans le fichier filename, à partir de l'image image. Le paramètre image a été créé avec la fonction imagecreatetruecolor().

    filename est optionnel et, s'il est omis, l'image sera envoyée directement au client. En plaçant l'en-tête image/vnd.wap.wbmp, dans le champ "content-type", vous pourrez afficher une image WBMP.

    Note : Le support WBMP n'est disponible que si PHP a été compilé avec GD-1.8 ou plus récent.


    En passant le paramètre optionnel foreground, vous pouvez choisir la couleur de fond. Utilisez l'identifiant retourné par imagecolorallocate() comme valeur de ce paramètre. La couleur de fond par défaut est noire.

    Voir aussi image2wbmp(), imagepng(), imagegif(), imagejpeg() et imagetypes().
    *************************************************************
    *************************************************************

    Même si je n'ai pas bien saisi la différence entre BMP etWBMP, je pense qu'il doit ainsi être possible d'aranger ton code pour qu'il puisse sauvegarder l'image réduite dans le même format que l'original et aussi travailler sur des BMP

  • signaler à un administrateur
    Commentaire de masternico le 22/06/2006 09:59:58

    Je viens juste de remarquer que l'image $im crée à partir de l'image source n'est pas détruite avant de sortir de la fonction. Elle reste en mémoire et peut donc finir par la saturer après avoir manipulé quelques images...
    =>> imagedestroy($im);

  • signaler à un administrateur
    Commentaire de TheSin le 22/06/2006 13:19:39

    Masternico => WBMP n'est malheureseument pas BMP.

    Quote of "clambert at whitecrown dot net" :
    "WBMP images are Wireless Bitmaps, not Windows Bitmaps. WBMP is used for bandwidth constrained, black and white, limited devices such as PDAs and Cell Phones."

    Commentaire venant de http://fr2.php.net/manual/fr/function.imagecreatefromwbmp.php

    Il faut donc bien créer toutes les fonctions ...
    Par ailleurs, ca serait bien si elles étaient natives à GD, sinon ça risque vraiment d'être lourd :S ...

  • signaler à un administrateur
    Commentaire de Palleas_44 le 22/06/2006 19:53:09

    Ah ouais j'avais pas pensé à gerer la sauvegarde de l'image sous plusieurs formats, c'est pas bête ^o)
    Je prend note :)
    Je vais aussi voir pour le bmp et pour Webdeb, c'est deja une fonction non? ;) Pour une classe objet je connais pas encore la poo :$ ca va venir, je suis en vacances j'aurais que ca à faire :p

    A bientot pour des modifs ;)

  • signaler à un administrateur
    Commentaire de webdeb le 23/06/2006 14:17:51

    Oups quel noob je n'avais pas vu que c'était une fonction en haut. Au temps pour moi. J'ai été dérouté par les commentaires ^^

  • signaler à un administrateur
    Commentaire de Palleas_44 le 23/06/2006 14:20:28

    C'est le soleil, la canicule tout ca... mon pauvre webdeb :p
    Enfin merci pour la note =)

  • signaler à un administrateur
    Commentaire de masternico le 25/06/2006 21:06:02

    Merci TheSin pour la précision à propos des WBMP. Je suis d'accord qu'une telle fonction de gestion des BMP manque cruellement à la GD... peut-être en cour de développement.
    Mais en même temps, vue la taille d'un BMP, rare sont les personnes qui utilise ce genre de fichier en upload ou download. En serait-ce la raison?
    Au fait, bon code, je mets 9/10 aussi... 10 se sera pour quand il y aura les autres formats de fichiers   ;)

  • signaler à un administrateur
    Commentaire de rduvrac le 11/08/2006 08:35:48

    très bien ce script :-D

    juste une question technique :

    Au lieu de mettre un vert fluo , il est pas possible de faire de la transparence à la place ?

  • signaler à un administrateur
    Commentaire de lotfikecir le 05/11/2006 18:43:46

    c'est vraiment du bon boulot je te tire chapeau ça m'a plus, juste un truc ya une erreur dans le ocde source au niveau des
         define('XMIN',0);
         define('YMAX',1000);
         define('XMIN',0); à changer par define('YMIN',0); parce que il y a une double déclaration mai sinon ça fonctionne très bien. de toute les façons je suis sur un projet ,j'ai untiliser at source qui m'est d'une grande utilité, dès que je l'aurai trminer je le posterai ici. A+
        

  • signaler à un administrateur
    Commentaire de edotheking le 10/02/2007 00:16:08

    J'ajouterai juste un truc sur cette source très bien faite, je n'ai pas compris pourquoi il y a un carré blanc de la hauteur maximale spécifiée...enfin c'était peut-etre voulu.
    De toute façon c'est pas bien dur de la modifier, il y a juste a changer les derniers parametres quand l'image est crée.

    En tout cas merci pour cette source bien utile (pourquoi s'embeter a coder des trucs comme ca quand d'autres l'on fait, et mieux que vous...).

  • signaler à un administrateur
    Commentaire de moimc le 04/05/2007 10:53:34

    Niquel, depuis le temps que j'en cherchais un correct.

    Par contre, une petite faute à corriger, à la fin de la fonction c'est 'dossier' et pas 'dosier' !

    merci

Ajouter un commentaire

Pub



Appels d'offres

Dessins techniques
Budget : 60€
Animation Flash - Doma...
Budget : 370€
Application flash medi...
Budget : 1 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Boutique

Boutique de goodies CodeS-SourceS