IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Script de redimensionnement d'images.


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 134
    Points : 47
    Points
    47
    Par défaut Script de redimensionnement d'images.
    Bonsoir,

    Mon topic change un peu de ceux que je fais d'habitudes, car je vais faire appel à vos avis concernant un de mes besoins.

    Je dois réaliser un script de redimensionnement d'images de profil. Jusque là tout va bien, j'en ai réalisé un qui fait très bien son boulot.

    Sauf qu'une même image pourra être redimensionné à différentes tailles dans plusieurs endroits.

    J'aimerais savoir comment vous vous y seriez pris à ma place. Je veux dire par là, pour faire un script léger, optimisé, qui répond à mes critères.

    Je ne demande pas de script tout fait, mais simplement des idées ou bien et pistes.

    Merci et bon WE.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut

    Amazon a mis en place 2 trucs assez simples et très efficaces :
    • De l'URL-rewriting : une règle du genre "(\w+)_(\d+)_(\d+).jpg" qui redirige vers "getImage.php?image=$1&largeur=$2&hauteur=$3" (bon mes regex sont approximatives, y a des cas particuliers à gérer, mais c'est l'idée). De cette manière l'appel HTTP "monImage_300_180.jpg" est redirigé vers le script de traitement des images en demandant "monImage.jpg" au format 300x180
    • Le script de traitement des images :
      • Stocke chaque image redimensionnée dans un fichier nommé genre nomImage_largeur_hauteur.jpg
      • Ne crée ce fichier que s'il n'existe pas encore ou si son LMT est antérieur au LMT de l'image originale
      • Renvoie au final le contenu du fichier avec le header(content-type) approprié


    Attention, pense éventuellement à mettre en place un système de purge des fichiers de cache si tu penses avoir un grand nombre d'images dans un grand nombre de formats...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 134
    Points : 47
    Points
    47
    Par défaut
    Tient quelqu'un qui habite dans le même arrondissement que moi.

    Merci, pour tes indications, je pense regarder ça dans la journée.

    Edit : Tu pourrais me passer le lien du tuto d'Amazon stp.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Y a pas de tuto chez Amazon, j'avais remarqué ça par hasard en regardant l'URL d'une image sur imdb.com (qui appartient à Amazon) :

    Par exemple, la première image qui vient ce matin sur amazon.com :
    Autre exemple sur imdb.com :

    Après tout dépend du niveau de complexité que tu souhaites atteindre, je ne pense pas que tu aies besoin d'un truc aussi chiadé qu'Amazon/IMDB, c'était surtout pour te montrer le concept de l'URL-Rewriting qui permet d'obtenir des images de différentes tailles.

    A vrai dire je ne sais pas précisément comment ça fonctionne derrière, mais partant de cette bonne idée qu'ils ont eue de réécrire les URLs des images, à leur place je ferais ce que je t'ai décrit dans mon premier post : un script PHP qui redimensionne à la volée, qui gère un cache et qui renvoie les bons headers puis le contenu du fichier de cache.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour, j'ai fait quelques fonctions ici :
    http://j-reaux.developpez.com/tutori...sionner-image/

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 134
    Points : 47
    Points
    47
    Par défaut
    Merci pour vos deux réponses, je vais étudier attentivement le script et vous tient au courant.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 134
    Points : 47
    Points
    47
    Par défaut
    J'ai pensé à un schéma assez simple.

    Enfaite, je vais travailler sur deux pages : index.php et redimensionner.php

    ==== INDEX.PHP ====

    - Je m'occupe ici de sélectionner l'image que je souhaite redimensionner ainsi que la hauteur et largeur maximum que je demande.
    - Ensuite j'envoie ces informations là à la page redimensionner.

    ==== REDIMENSIONNER.PHP ====

    C'est là où tout ce joue.
    - Dans un premier temps, je récupère les trois variables.
    - Ensuite, je vais redimensionner l'image par rapport à la largeur max.
    - Une fois l'image redimensionné, on teste voir si la hauteur est supérieur ou inférieur à la hauteur max autorisé.
    - Si elle est supérieur, alors on redimensionne non pas par la largeur mais pas la hauteur.
    - Sinon, on laisse tel quel.
    - On crée ensuite l'image et on la revoit sur la page index.php pour l'afficher.

    J'ai presque finis la confection de ce code, mais j'ai juste un problème assez important. Je ne sais pas par quel moyen faire la navette des variables entre ces deux pages, sachant que je n'utilise aucun formulaire et je ne souhaite qu'a aucun moment l'utilisateur est accès à redimensionner.php.

    Merci.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    si tu as lu mon tuto, tu remarqueras que ton fichier "redimensionnement .php" ressemblera furieusement à ca :
    http://j-reaux.developpez.com/tutori...er-image/#LIII.
    (en donnant en paramètres la hauteur et largeur maximum que tu demandes)

    Tu peux :
    - soit le mettre en "include" dans ton "index.php",
    - ou alors, dans "redimensionnement.php", à la fin du traitement, tu fais une redirection vers ton "index.php" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       header("location: ./index.php);
       exit;
    Par contre, il faut récupérer tes variables, et je ne comprends pas comment tu fait "sans formulaire" (?) ... :
    - soit tu les passes dans l'URL (récupérés par $_GET['...']),
    - soit (avec formulaire) dans des <input type ="hidden" ...> (récupérés par $_POST['...'])

    Sauf qu'une même image pourra être redimensionné à différentes tailles dans plusieurs endroits.
    Dans ce cas, tu peux utiliser à l'endroit concerné :
    http://j-reaux.developpez.com/tutori...ner-image/#LII

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 134
    Points : 47
    Points
    47
    Par défaut
    Arf désolé, tu passes un peu trop tard, j'ai finalisé quelques heures avant une première version qui fait à peu prêt bien son boulot.

    parametres.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    <?php
    if(isset($_COOKIE['pseudo']) && $_COOKIE['pseudo'] !== ''){
    							$pseudo = $_COOKIE['pseudo'];
    						}
    						else{
    							$pseudo = $_SESSION['pseudo'];
    						}
     
    						if(isset($_POST['envoyer_photo'])){
    							$largeur_maxi = 300;
    							$hauteur_maxi = 400;
    							$photo_uploade = $_FILES['photo']['tmp_name'];
    							$nom = $_FILES['photo']['name'];
    							$erreur_photo = $_FILES['photo']['error'];
    							$taille = $_FILES['photo']['size'];
     
    							include('redimensionner.php');
     
    							if(!is_dir('photos/')){
    								mkdir('photos', 0700);
    							}
    							if(!is_dir('photos/'.$pseudo)){
    								mkdir('photos/'.$pseudo, 0700);
    							}
    							if(!is_dir('photos/'.$pseudo.'/photo_profil')){
    								mkdir('photos/'.$pseudo.'/photo_profil', 0700);
    							}
     
    							$nom = 'photo_profil';
    							$liste = scandir('photos/'.$pseudo.'/photo_profil');
    							if($liste[2] !== ''){
    								unlink('photos/'.$pseudo.'/photo_profil/'.$liste[2].'');
    							}
    							$destination_photo = 'photos/'.$pseudo.'/photo_profil/';
    							$nom = 'photo_profil'.$extension_upload;
     
    							if($extension_upload == '.gif'){
    								imagegif($photo_miniature,$destination_photo.$nom);
    							}
    							elseif($extension_upload == '.png'){
    								imagepng($photo_miniature,$destination_photo.$nom,9);
    							}
     
    							else{
    								imagejpeg($photo_miniature,$destination_photo.$nom,100);
    							}
     
    							switch($verif_photo){
    								case 1:
    									echo 'Merci de renseigner une photo dans le formulaire ci-dessous.';
    								break;
    								case 2:
    									echo 'Extension du fichier non valide. Les extensions acceptés sont jpg, jpeg, gif, png';
    								break;
    							}
    							print("<script language = \"JavaScript\">"); 
    							print("location.href = 'parametres.php?ref=2';"); 
    							print("</script>");
    						}
    						$scan = scandir('photos/'.$pseudo.'/photo_profil/');
    						echo'<center><img src="photos/'.$pseudo.'/photo_profil/'.$scan[2].'"></center>';
    						?>
    						<form method="post" enctype="multipart/form-data">
    							Photo de profil : <br />
    							<input type="file" name="photo" style="margin-left:50px;"><br /><br />
    							<input type="submit" name="envoyer_photo"> 
    						</form>
    ?>
    redimensionner.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    <?php
    function erreur_photo($extension_upload,$extensions_valides){
    	if($taille === 0){
    		return 1;
    	}
    	elseif(!in_array($extension_upload,$extensions_valides)){
    		return 2;
    	}
    	else{
    		$erreur = null;
    		return $erreur;
    	}
    }
     
    $extension_upload = strtolower(strrchr($nom,'.'));
    $extensions_valides = array('.jpg','.jpeg','.gif','.png');
    $verif_photo = erreur_photo($extension_upload,$extensions_valides);
     
    if(empty($verif_photo)){
    	if($extension_upload == '.gif'){
    		$image_choisie = imagecreatefromgif($photo_uploade);
    	}
    	elseif($extension_upload == '.png'){
    		$image_choisie = imagecreatefrompng($photo_uploade);
    	}							
    	else{
    		$image_choisie = imagecreatefromjpeg($photo_uploade);
    	}
    }
    $taille_image = getimagesize($photo_uploade);
    $reduction = (($largeur_maxi * 100)/$taille_image[0]);
    $hauteur = (($taille_image[1] * $reduction)/100);
     
    if($hauteur > $hauteur_maxi){
    	$reduction = (($hauteur_maxi * 100)/$taille_image[1]);
    	$largeur = (($taille_image[0] * $reduction)/100);
    	$photo_miniature = imagecreatetruecolor($largeur,$hauteur_maxi);
    	imagecopyresampled($photo_miniature,$image_choisie,0,0,0,0,$largeur,$hauteur_maxi,$taille_image[0],$taille_image[1]);
    }
    else{
    	$reduction = (($largeur_maxi * 100)/$taille_image[0]);
    	$hauteur = (($taille_image[1] * $reduction)/100);
    	$photo_miniature = imagecreatetruecolor($largeur_maxi,$hauteur);
    	imagecopyresampled($photo_miniature,$image_choisie,0,0,0,0,$largeur_maxi,$hauteur,$taille_image[0],$taille_image[1]);
    }
    imagedestroy($image_choisie);
    ?>
    Le script marche bien, mais les erreurs ne s'affichent jamais. U_u

    Une idée ?

    Merci.

    Edit : N'hésitez pas à me dire ce qui cloche dans mon script.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 134
    Points : 47
    Points
    47
    Par défaut
    Après une petite réécriture du script, j'ai corrigé la partie qui empêchait les erreurs de s'afficher.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Photoshop script pour redimensionner une image
    Par corenitec dans le forum Imagerie
    Réponses: 3
    Dernier message: 05/02/2012, 19h40
  2. Script qui redimensionne les images
    Par Laetitia7771 dans le forum Langage
    Réponses: 1
    Dernier message: 02/01/2012, 15h21
  3. [Galerie] Script de redimensionnement d'images carrées
    Par Sayrus dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 8
    Dernier message: 15/06/2009, 08h49
  4. Script en shell, redimensionner des images
    Par recome dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 19/03/2009, 12h37
  5. [Forum] Script upload + redimensionnement image jpg
    Par baleiney dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 6
    Dernier message: 03/07/2006, 11h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo