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

Bibliothèques et frameworks PHP Discussion :

[GD] redimensionnement intelligent [Sources]


Sujet :

Bibliothèques et frameworks PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Ingénieur réseau et sécurité / Consultant
    Inscrit en
    Août 2005
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur réseau et sécurité / Consultant
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 1 068
    Par défaut [GD] redimensionnement intelligent
    Bonjour tout le monde,

    voila je suis entrain de développez un site qui permet l'upload de photos. Maintenant le truc c'est que j'aimerai que les photos uploadées répondent à certaines règles qui sont les suivantes :

    • Taille max 320 * 240
    • Poids max 500 ko
    • toutes en extension .jpg


    pour le moment mon script fais ceci :

    • supprime les espaces dans le nom de fichier
    • check si le fichier existe
    • renome un fichier si il existe
    • vérifie si c'est bien un fichier image


    maintenant j'aimerai faire un script de redimensionnement mais intelligent dans le sens que si l'image est en 800 * 600 et qu'elle fais 2 mo, on dois arriver a un poids max de 500 ko et une taille max de 320 * 240 mais je ne veux pas que l'image soit déformée donc il faut surement travailler en linkant les la taille de base. Genre si l'image fais 640 * 480 sa ne pose pas de problème car on divise par deux la taille de base et on oublie pas de checked si le poids de l'image ne dépasse pas le max mais comment faire ce calcule si l'image a une taille par exemple de 648 * 376 par exemple soit disant une taille totalement aléatoire ?

    c'est ici que je bloque. merci de me donner un coup de main

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 138
    Par défaut
    L'idée c'est de fixer des "limites" acceptables comme taille pour ton site.
    exemple: tu veux du 300*200.

    Ensuite tu fais les traitements dans cet ordre:
    upload de l'image , là tu checkes son format de fichier (jpg, gif, etc..) et tu filtres à l'upload ce genre de choses.

    Ensuite tu passes l'image récupéré dans une fonction qui effectuera les opérations suivantes :
    ->récupération de la taille de l'image (getimagesize()).
    ->Tu vérifies si la largeur de l'image est supèrieure à celle que tu autorises.
    ->Si c'est ok, tu fais le meme test sur la hauteur.
    ->Si c'est pas ok, tu copies l'image dans une image tampon (imagecreatefrompng, imagecreatefromgif, etc..), puis tu calcules par une règle de trois les nouvelles dimensions que dois avoir ton image.
    exemple tu as du 340*200. 340>300 donc pas ok. tu poses donc la règle suivante:
    largeur_image=340 --->largeur_finale=300
    hauteur_image=200 --->hauteur_finale=X

    donc ta largeur est finale est à 300 et ta hauteur finale est a (300*200)/340 soit 176.

    la hauteur obtenue est inférieurs à celle que tu as préconisé pour ton site (176<200) donc tu as les dimensiosn finales et proportionnées de ton image:300*176. Si tu avais obtenu au lieu de 176, uen valeur >200 (exemple 220), il aurait fallu faire une nouvelle opération semblale à celle ci sauf que tu aurais fait:
    hauteur_image =220 --> hauteur_finale : 200
    largeur_image= 300 -->largeur_final: X
    etc...

    Tu finis donc pas avoir les dimensions finales et proportionnées de ton image.
    Après tu crées ta nouvelle image à l'aide des fonctions GD et des dimensions finales de ton image (imagecopyresampled) et tu l'enregistres, tu arrives donc à une image respectant tes normes et proportionnés à l'image saisie au départ.

    Bon voilà je t'ai donné l'algo et les fonctions associées, j'espère que ca te suffira pour avancer.

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 138
    Par défaut
    voici un bout de ma fonction qui gérer ça:

    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
     
                  if(eregi("jpg",$extension)){
                  $src=imagecreatefromjpeg($chemin.$image);
                  $trouve=true;
                  }
                  if(eregi("gif",$extension)){
                  $src=imagecreatefromgif($chemin.$image);
                  $trouve=true;
                  }
                  if(eregi("png",$extension)){
                  $src=imagecreatefrompng($chemin.$image);
                  $trouve=true;
                  }
                  if($trouve==false){
                  return "";
                  }
                  //$src=imagecreatefromjpeg("http://www.nautiplus.com/".$image);
                  $size =getimagesize($chemin.$image);
                  $largeur_src=$size[0];
                  $hauteur_src=$size[1];
                  //cas ou l'image a une largeur trop grande
                  if ($largeur_src>$largmax){
                    //on calcul le ratio pour retailler l'image
                    //echo "largsrc>max";
                    $ratio=($largeur_src)/($largmax);
                    $nouvelle_hauteur=($hauteur_src/$ratio)-1;
                    $nouvelle_largeur=$largeur;
                    if($nouvelle_hauteur>$hauteur){
                       $nouvelle_largeur=round($nouvelle_largeur*($hauteur/$nouvelle_hauteur))-1;
                       $nouvelle_hauteur=$hauteur;
                    }
                    //echo "resize a largeur:".round($nouvelle_largeur)." et hauteur:".round($nouvelle_hauteur)."<br>";
                    $im=imagecreatetruecolor(round($nouvelle_largeur), round($nouvelle_hauteur));
                    //echo "<br>imagecreatruecolor";
                    imagecopyresampled($im,$src,0,0,0,0,round($nouvelle_largeur),round($nouvelle_hauteur),$largeur_src,$hauteur_src);
                    //echo "<br>imagecopyresampled";
                    $dest=$chemin_dest."/".$image;
                    imagejpeg($im,$dest);
    C'est un bout de code assez ancien et pas secure à 100% mais qui marche bien si ça peut t'aider.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Ingénieur réseau et sécurité / Consultant
    Inscrit en
    Août 2005
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur réseau et sécurité / Consultant
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 1 068
    Par défaut
    merci pour ton aglo dans ton premier post ! je vais étudier tout sa et je te redierai ! merci

  5. #5
    Membre éprouvé
    Homme Profil pro
    Ingénieur réseau et sécurité / Consultant
    Inscrit en
    Août 2005
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur réseau et sécurité / Consultant
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 1 068
    Par défaut
    re ! je bloque au niveau du calcule en faite... si quelqu'un voit comment je pourrait faire ???

    merci

    voici mon code pour l'instant :

    <?php
    /*&#160;fonction&#160;utile&#160;pour&#160;connaitre&#160;l'extention&#160;d'un&#160;fichier&#160;*/
    function&#160;getExt&#160;($sString,&#160;$lCase&#160;=&#160;true){
    &#160;&#160;&#160;&#160;&#160;&#160;if(!
    strpos&#160;($sString,&#160;'.')&#160;||&#160;!is_string&#160;($sString))
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;
    false;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;
    $ext&#160;=&#160;substr($sString,strrpos($sString,'.')+1);
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;return&#160;(
    $lCase)&#160;?&#160;strtolower($ext)&#160;:&#160;$ext;
    }
    &#160;&#160;&#160;&#160;&#160;&#160;

    $image_source_path&#160;=&#160;'images/image.source.jpeg';&#160;//image&#160;source

    if(file_exists($image_source_path)){//on&#160;check&#160;si&#160;le&#160;fichier&#160;existe
    &#160;&#160;&#160;&#160;&#160;&#160;
    $file_type&#160;=&#160;getExt($image_source_path);&#160;//on&#160;récupère&#160;l'extension&#160;du&#160;fichier
    &#160;&#160;&#160;&#160;&#160;&#160;
    switch($file_type){&#160;//on&#160;test&#160;l'extension
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    case'jpeg':
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    $isValid&#160;=&#160;true;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    $imageBuffer&#160;=&#160;imagecreatefromjpeg($image_source_path);
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;break;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;case
    'jpg':
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    $isValid&#160;=&#160;true;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    $imageBuffer&#160;=&#160;imagecreatefromjpeg($image_source_path);
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;break;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;case
    'gif':
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    $isValid&#160;=&#160;true;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    $imageBuffer&#160;=&#160;imagecreatefromgif($image_source_path);
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;break;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;case
    'png':
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    $isValid&#160;=&#160;true;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    $imageBuffer&#160;=&#160;imagecreatefrompng($image_source_path);
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;break;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;default:
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    $isValid&#160;=&#160;false;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;exit(
    'ce&#160;n\'est&#160;pas&#160;une&#160;image');
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;break;
    &#160;&#160;&#160;&#160;&#160;&#160;}
    &#160;&#160;&#160;&#160;&#160;&#160;
    &#160;&#160;&#160;&#160;&#160;&#160;if(
    $isValid){&#160;//si&#160;c'est&#160;une&#160;image&#160;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    $heightMax&#160;=&#160;240;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    $weightMax&#160;=&#160;320;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    $heightImage&#160;=&#160;imagesy($imageBuffer);&#160;//on&#160;prend&#160;sa&#160;hauteur
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    $weightImage&#160;=&#160;imagesx($imageBuffer);&#160;//et&#160;sa&#160;largeur
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    if($weightImage&#160;>&#160;$weightMax){
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    $ratio&#160;=&#160;$weightImage&#160;/&#160;$weightMax;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    $newHeight&#160;=&#160;($heightImage&#160;/&#160;$ratio)&#160;-1;
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    //la&#160;suite&#160;???
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    }
    &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    &#160;&#160;&#160;&#160;&#160;&#160;}
    &#160;&#160;&#160;&#160;&#160;&#160;
    }else{
    &#160;&#160;&#160;&#160;&#160;&#160;exit(
    $image_source_path.'&#160;n\'existe&#160;pas.');
    }
    ?>
    Colorez votre code PHP sur les forums grâce à Developpez.com

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 138
    Par défaut
    J'ai essayé en fonction de ce que tu as commencé à faire. Par contre j'ai pas vérifié.
    maintenant, je t'en dirai plus ce coir quand je pourrai tester si jamais tu as des problèmes.

    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
    70
    71
    72
    73
    <?php
    /* fonction utile pour connaitre l'extention d'un fichier */
    function getExt ($sString, $lCase = true){
          if(!strpos ($sString, '.') || !is_string ($sString))
                   return false;
           $ext = substr($sString,strrpos($sString,'.')+1);
           return ($lCase) ? strtolower($ext) : $ext;
    }
     
     
    $image_source_path = 'images/image.source.jpeg'; //image source
     
    if(file_exists($image_source_path)){//on check si le fichier existe
          $file_type = getExt($image_source_path); //on récupère l'extension du fichier
          switch($file_type){ //on test l'extension
                case'jpeg':
                      $isValid = true;
                      $imageBuffer = imagecreatefromjpeg($image_source_path);
                break;
                case'jpg':
                      $isValid = true;
                      $imageBuffer = imagecreatefromjpeg($image_source_path);
                break;
                case'gif':
                      $isValid = true;
                      $imageBuffer = imagecreatefromgif($image_source_path);
                break;
                case'png':
                      $isValid = true;
                      $imageBuffer = imagecreatefrompng($image_source_path);
                break;
                default:
                      $isValid = false;
                      exit('ce n\'est pas une image');
                break;
          }
     
          if($isValid){ //si c'est une image 
                $heightMax = 240;
                $weightMax = 320;
                $heightImage = imagesy($imageBuffer); //on prend sa hauteur
                $weightImage = imagesx($imageBuffer); //et sa largeur
                $curr_height=$heightImage;
                $curr_weight=$weightImage;
                if($weightImage > $weightMax){
                      $ratio = $weightImage / $weightMax;
                      $newHeight = ($heightImage / $ratio) -1;
                      //la suite ???
                      //ajout Raideman
                      $newWeight=$weightMax;
                      $curr_height=$newHeight;
                      $curr_weight=$newWeight;
                }
                //on a retravaillé en fonction de la largeur, on vérifie la hauteur maintenant
                if ($curr_height>$heightMax) {
                      $ratio = $curr_height / $heightMax;
                      $newWeight = ($curr_weight / $ratio) -1;
                      $newHeight=$heightMax;
     
                }
                //On a les dimensions finales $newWeight et $newHeight
                //on cree une image vide aux nouvelles dimensiosn
                $im=imagecreatetruecolor(round($newWeight), round($newHeight));
                //on copie dedans notre image retaillés
                imagecopyresampled($im,$imageBuffer,0,0,0,0,round($newWeight),round($newHeight),$weightImage,$heightImage);
                //$dest est le chemin de destination
                imagejpeg($im,$dest);
          }
     
    }else{
          exit($image_source_path.' n\'existe pas.');
    }
    ?>

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

Discussions similaires

  1. Débat sur l'I.A (Intelligence Artificielle)
    Par Anonymous dans le forum Intelligence artificielle
    Réponses: 457
    Dernier message: 05/07/2016, 01h11
  2. [VB6] [Interface] Redimensionnement automatique
    Par ychalan dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 30/09/2002, 18h32
  3. redimensionnement d'une JWindow
    Par mbp566 dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 02/08/2002, 03h41
  4. Redimensionnement des Paquets IP sur un Réseau Local
    Par Bonoboo dans le forum Développement
    Réponses: 2
    Dernier message: 12/07/2002, 15h40
  5. Redimensionnement d'une surface
    Par Freakazoid dans le forum DirectX
    Réponses: 4
    Dernier message: 01/07/2002, 22h01

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