begin process at 2008 08 28 19:12:35
1 233 316 membres
412 nouveaux aujourd'hui
14 291 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 !

CRÉATION DE MINIATURE D'UNE IMAGE


Information sur la source

Catégorie :Graphique Classé sous : image, miniature, gd2, réduire Niveau : Débutant Date de création : 24/11/2007 Date de mise à jour : 26/11/2007 09:54:40 Vu / téléchargé: 5 484 / 243

Note :
Aucune note

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

Description

Cette fonction enregistre une miniature d'une image.
Les paramètres sont :
- le chemin complet de l'image source.
- le répertoire de destination de l'image réduite.
- la taille maximale de l'image réduite.
- le nom de l'image réduite.
- un flag pour écraser ou pas l'image réduite si elle existe déjà.

Source

  • <?
  • /**
  • * @name miniature
  • * Créer une miniature d'une image donnée et en retourne l'adresse.
  • *
  • * @param String sPathFrom : Répertoire d'origine
  • * @param String sPathTo : Répertoire de destination
  • * @param String integer iMaxDimension : Taille maximale de la miniature
  • * @param boolean bOverwrite : Ecraser la miniature si elle existe
  • *
  • * @return String Adresse de la miniature nouvellement crée.
  • */
  • function miniature ($sPathFrom, $sPathTo, $iMaxDimension, $sNameImage, $bOverwrite=false)
  • {
  • //test des paramètres
  • try {
  • if (!is_string($sPathFrom) )
  • throw new Exception ('erreur : miniature(). sPathFrom must be a string');
  • if (!is_string($sPathTo) )
  • throw new Exception ('erreur : miniature(). sPathTo must be a string');
  • if (!is_int($iMaxDimension) )
  • throw new Exception ('erreur : miniature(). iMaxDimension must be a numeric');
  • if (!is_string($sNameImage) )
  • throw new Exception ('erreur : miniature(). sNameImage must be a string');
  • if (!is_bool($bOverwrite) )
  • throw new Exception ('erreur : miniature(). bOverwrite must be a boolean');
  • }
  • catch (Exception $e) {
  • echo $e->getMessage()."\n";
  • return false;
  • }
  • // fin test des paramètres
  • //répertoire de l'image
  • $dir_img = substr($sPathFrom, 0, strrpos($sPathFrom, "/")+1);
  • //test si le fichier existe et qu'on écrase OU que le fichier n'existe pas.
  • if((file_exists($sPathTo.$sNameImage) && true === $bOverwrite) || !file_exists($sPathTo.$sNameImage)) {
  • //Largeur et hauteur des miniatures
  • $width = $iMaxDimension;
  • $height = $iMaxDimension;
  • // Calcul des nouvelles dimensions en gardant les proportions
  • list($width_orig, $height_orig) = getimagesize($sPathFrom);
  • if ($width && ($width_orig < $height_orig))
  • $width = ($height / $height_orig) * $width_orig;
  • else
  • $height = ($width / $width_orig) * $height_orig;
  • // création d'une image vierge
  • $mini = @ImageCreateTrueColor($width, $height)
  • or die ("Impossible de crée un flux d'image GD");
  • //On ressample l'image initiale pour en créer une copie en miniature
  • $imgSrc = imagecreatefromjpeg($sPathFrom);
  • ImageCopyResampled($mini, $imgSrc, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
  • //On enregistre l'image dans le répertoire des miniatures
  • if (!file_exists($sPathTo) ) {
  • mkdir($sPathTo);
  • chmod ($sPathTo, 0764);
  • }
  • imageJpeg($mini, "".$sPathTo.$sNameImage.".jpg");
  • }
  • return $sPathTo.$sNameImage.".jpg";
  • }
  • ?>
<?
	/**
	* @name miniature
	* Créer une miniature d'une image donnée et en retourne l'adresse.
	* 
	* @param String sPathFrom : Répertoire d'origine
	* @param String sPathTo : Répertoire de destination
	* @param String integer iMaxDimension : Taille maximale de la miniature
	* @param boolean bOverwrite : Ecraser la miniature si elle existe
	*
	* @return String Adresse de la miniature nouvellement crée.
	*/
	
	function miniature ($sPathFrom, $sPathTo, $iMaxDimension, $sNameImage, $bOverwrite=false)
	{
		//test des paramètres 
		try {
			if (!is_string($sPathFrom) ) 
				throw new Exception ('erreur : miniature(). sPathFrom must be a string');
			
			if (!is_string($sPathTo) ) 
				throw new Exception ('erreur : miniature(). sPathTo must be a string');
			
			if (!is_int($iMaxDimension) ) 
				throw new Exception ('erreur : miniature(). iMaxDimension must be a numeric');
			
			if (!is_string($sNameImage) ) 
				throw new Exception ('erreur : miniature(). sNameImage must be a string');
			
			if (!is_bool($bOverwrite) ) 
				throw new Exception ('erreur : miniature(). bOverwrite must be a boolean');	
		}
		catch (Exception $e) {
			echo $e->getMessage()."\n";
			return false;
		}
		// fin test des paramètres
		
		//répertoire de l'image
		$dir_img = substr($sPathFrom, 0, strrpos($sPathFrom, "/")+1);
				
		//test si le fichier existe et qu'on écrase OU que le fichier n'existe pas.
		if((file_exists($sPathTo.$sNameImage) && true === $bOverwrite) || !file_exists($sPathTo.$sNameImage)) {
			//Largeur et hauteur des miniatures
			$width = $iMaxDimension;
			$height = $iMaxDimension;
			
			// Calcul des nouvelles dimensions en gardant les proportions
			list($width_orig, $height_orig) = getimagesize($sPathFrom);
		
			if ($width && ($width_orig < $height_orig)) 
				$width = ($height / $height_orig) * $width_orig;
			else 
				$height = ($width / $width_orig) * $height_orig;
			
			// création d'une image vierge
			$mini = @ImageCreateTrueColor($width, $height)
				 or die ("Impossible de crée un flux d'image GD");
					
			//On ressample l'image initiale pour en créer une copie en miniature
			$imgSrc = imagecreatefromjpeg($sPathFrom);
			ImageCopyResampled($mini, $imgSrc, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
			
			//On enregistre l'image dans le répertoire des miniatures
			if (!file_exists($sPathTo) ) {	
				mkdir($sPathTo);
				chmod ($sPathTo, 0764);
			}
			imageJpeg($mini, "".$sPathTo.$sNameImage.".jpg");
		}
		
		return $sPathTo.$sNameImage.".jpg";
	}
?>

Conclusion

Première source alors soyez indulgant... svp
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

25 novembre 2007 17:01:48 :
Deuxième version de cette fonction en tenant compte des commentaires... (commentaire, test si fichier existant)
25 novembre 2007 17:03:20 :
Deuxième version de cette fonction en tenant compte des commentaires (commentaires explicatif, test du fichier existant).
26 novembre 2007 09:54:40 :
mise à jour en fonction des conseils de malalam
  • signaler à un administrateur
    Commentaire de codefalse le 24/11/2007 21:26:59 administrateur CS

    J'aurai quelques points à dire à propos de ta source :

    Tout d'abord, teste ce qui est mis en paramètres : si c'est une chaine de caractères, un boolean (ce que tu devrait mettre pour le dernier paramètre, plutot que 1 ou 0), etc.

    Ensuite, l'algorithme n'est pas très bien posé, tu test si tu peux écraser avant de tester si le fichier existe, par exemple. Teste déjà si le fichier existe, ensuite, si oui, si tu peux l'écraser.

    Un truc agréable, c'est de nommer plus précisément des variables, tel que
    $sPath pour indiquer que la variable $sPath est un String contenant une Adresse (tu peux dire $sPathImageDest ou un truc du genre)

    Avant de genrer tes images, verifier si la librairie gd est installée serait un mieux (tu teste l'existence une fonction spécifique à la gd)
    Un autre point qui m'intéresserait, si je voulais utiliser ton script, c'est de choisir l'extension.
    Là, tu nous impose du jpeg. Et si je veux du png ?
    Par ailleur, on ne peux choisir la taille de la miniature. Tu spécifie une taille max, que ce soit en longueur ou en largeur. Ce serait bien de choisir quel partie on veut retrécir au max (je veux une largeur de x max, mais peu importe la hauteur ! :p)

    Au vue des commentaires d'indication, tu veux t'approcher d'une documentation à la style phpdoc. Regarde comment cela est fait :

    /**
    * @name miniature
    * Créer une miniature d'une image donnée et en retourne l'adresse.
    *
    * @param String sPathFrom : Répertoire d'origine
    * @param String sPathTo : Répertoire de destination
    * @param String integer iMaxDimension : Taille maximale de la miniature
    * @param boolean bOverwrite : Ecraser la miniature si elle existe
    *
    * @return String Adresse de la miniature nouvellement crée.
    */

    Enfin voila, quelques points à corriger et ca deviendra intéressant :)
    J'attends la nouvelle mise à jour, donc pour l'instant je ne mettrait pas de notes.

    Courage :)

  • signaler à un administrateur
    Commentaire de Teclis01 le 25/11/2007 02:44:08

    Euh problème !!!
    J'adhère a ce que dit codefalse néanmoins je vais essayer d'apporter 2/3 choses en plus.
    Déjà cette source n'est pas de niveau initié (a voir si elle le devient)
    Ensuite renseigne toi sur les fonction variable... ça pourrait t'aider à resoudre quelques problèmatique (http://www.manuelphp.com/php/functions.variable-functions.php)
    Une fonction oui ... mais pourquoi pas une classe ?
    Le typage evidement... ça evitera d'ecrire des choses dans ce goût là ...
    if ($width && ($width_orig < $height_orig)) {
    Voilà ... En esperant que cette source s'améliore et en te souhaitant bonne continuation

  • signaler à un administrateur
    Commentaire de coucou747 le 25/11/2007 15:58:12

    Une fonction oui ... mais pourquoi pas une classe ? => nan pas une class pour ca... ou alors tu fais une class ImageHandler qui t'abstrait de gd...

    nan moi par contre je suis contre le manque de flags... tu devrais en avoir pour beaucoup plus de choses... genre garder la proportionalite, l'appliquer par defaut, par exes, etc...

  • signaler à un administrateur
    Commentaire de codefalse le 25/11/2007 16:53:52 administrateur CS

    a la rigueur cette fonction aura sa place dans une classe de type upload par exemple :)
    Et carrément plus de flags oué ! C'est ce qui permet la modularité d'une fonction :)

  • signaler à un administrateur
    Commentaire de waterw72 le 25/11/2007 16:58:57

    Pour information, cette fonction est utlisée par une autre fonction listant
    le contenu d'un répertoire (à la recherche d'image afin de les afficher en
    miniature).
    Bon, je fais une classe Image ou pas?

  • signaler à un administrateur
    Commentaire de neigedhiver le 25/11/2007 17:57:50

    Salut,

    C'est intéressant tout ça. J'aimerais réagir sur certains points.

    CodeFalse: "Avant de genrer tes images, verifier si la librairie gd est installée serait un mieux (tu teste l'existence une fonction spécifique à la gd)"

    extension_loaded() permet de savoir si une extension est chargée ou non...
    Quand on sait que GD est chargée, on peut aussi vérifier sa version avec gd_info() ... Ca dépend des fonctions utilisées et des formats de fichiers traités.

    Concernant la question d'en faire une classe ou pas, moi je vote pour. Ce serait plus joli.
    Comme le dit Coucou747, une classe qui permet de s'abstraire de GD. Comme on s'abstrait de MySQL ou PostgreSQL, ou autre.
    On pourrait avoir une classe abstraite ImageHandler, et des classes concrètes suivant qu'on utilise GD, ImageMagick, ou autre (y'en a surement d'autres en plus).
    Et puis des classes pour les différents formats de fichiers (gif, jpeg, png, et pourquoi pas ico ou autre).
    Une classe miniature qui serait une classe étendue de la classe Image, et qui se construirait à partir d'un objet image (la source à redimensionner).
    La classe miniature pourrait accepter en paramètre des formats prédéfinis dans un fichier xml, ce qui permettrait avec le même objet de faire plusieurs miniatures d'une même images, mais de tailles différentes (une taille pour une mosaique, une pour un disporama, sans toucher à la taille d'origine).

    waterw72 :"Pour information, cette fonction est utlisée par une autre fonction listant le contenu d'un répertoire (à la recherche d'image afin de les afficher en miniature)."

    Ca c'est un petit truc qui me gêne... Enfin... En programmation procédurale, non, mais si tu veux faire une classe, tu ferais mieux d'avoir un itérateur avec filtre sur un répertoire, qui permet de ne récupérer que les images.
    C'est une classe très simple à écrire et qui permet de récupérer les images d'un répertoire (éventuellement de manière récursive) avec 3 lignes de code.

    Avec quelques classes bien faites, redimensionner une image se fera en 2 lignes. Combiné à la source de malalam pour les traitements de masse trop long pour le temps d'exécution de php, ça pourrait donner une très bonne base de galerie photo...

  • signaler à un administrateur
    Commentaire de malalam le 25/11/2007 19:46:57 administrateur CS

    Hello,

    ben moi je suis d'accord avec Coucou sur ce coup-là.  On a un code qui fait du redimensionnement, c'est tout. Certes l'algo n'est pas terrible et devrait être amélioré. Oui ça manque d'options. Mais ça reste un script de redimensionnement d'images...une classe pour ça, ce serait déplacé.
    Alors si on se fend d'un gros package de traitement des images, là ok, en effet. Mais si c'est juste pour faire du redimensionnement, une fonction c'est très bien.

  • signaler à un administrateur
    Commentaire de neigedhiver le 25/11/2007 19:55:44

    Ben on est 3 du même avis alors.

  • signaler à un administrateur
    Commentaire de coucou747 le 25/11/2007 19:57:28

    ouais, je suis d'accord avec malalam : moi aussi je suis d'accord avec Coucou sur ce coup-là. et peut-etre meme sur les autres coups

  • signaler à un administrateur
    Commentaire de naej56 le 10/03/2008 20:35:14

    bonjour a tous.
    Je suis un débutant (très débutant) et j'ai utiliser ce bout de code pour créer mes miniatures.

    <?php

    $img_src = 'image.jpg';
    $img_dst = "miniature/miniature_$img_src";

    header('Content-type: image/jpeg');

    list($width, $height) = getimagesize($img_src);


    $newwidth = 100;
    $newheight = ((((100*$newwidth)/$width)*$height)/100);

    $thumb = imagecreatetruecolor($newwidth, $newheight);
    $source = imagecreatefromjpeg($img_src);

    imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

    imagejpeg($thumb);

    imagejpeg( $thumb, $img_dst, 100);
    ?>

    Je ne sais pas si c'est vraiment la même chose que le code proposé par waterw72 (je ne comprend pas tout ce qu'il a fait je ne suis pas encore au point) mais au final ce bout de code me donne bien une miniature de l'image de départ en conservant les proportions.
    Je voudrais bien savoir si ce code est a peu près correct.

    Merci d'avance pour vos réponses.

  • signaler à un administrateur
    Commentaire de Villa Flore le 26/04/2008 02:55:42

    NON AFFICHAGE DES MINIATURES

    Bonjour et merci pour ce code ... et merci à tous les codes qui m'ont aidé à monter mon site.

    J'ai donc utilisé ce code pour créer des miniatures à mes albums de photos en les mettant dans un sous répertoire.
    Quand j'ouvre mon album, les miniatures doivent s'afficher et en cliquant dessus, l'original apparait dans sa grande dimension.
    CEPENDANT, les miniatures ne s'affichaient pas. Juste le texte alternatif du "alt".
    Après bien des recherches sur Google (dieu, puisqu'il répond à tout), je suis arrivé à la REPONSE.

    Il s'agit de   CHMOD()

    Le code proposé par défaut est   764
    Or il ne permet pas au "public" d'exécuter ce répertoire.
    Il a donc fallu le changer en   755

    Maintenant les miniatures s'affichent correctement et en cliquant dessus, l'original apparait dans sa grande dimension.

    Pour plus de précisions :
         http://fr.wikipedia.org/wiki/Chmod          explique parfaitement la composition des codes.

         http://www.raynette.fr/script-gratuit/aide-chmod.php      donne le mode opératoire du paramétrage sur Filezila (ou autre).


Ajouter un commentaire

Pub



Appels d'offres

Recherche developpeur ...
Budget : 700€
SITE MARCHAND LOCATION...
Budget : 3 000€
SITE MARCHAND POUR HOTEL
Budget : 4 000€

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS