Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > Images > GD
GD Forum d'entraide pour l'extension GD permettant de manipuler des images en PHP. Avant de poster -> tutoriels GD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/03/2007, 11h29   #1
Membre éprouvé
 
Homme Cyrill Gremaud
Ingénieur systèmes et réseaux
Inscription : août 2005
Messages : 1 002
Détails du profil
Informations personnelles :
Nom : Homme Cyrill Gremaud
Âge : 23
Localisation : Suisse

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Enseignement

Informations forums :
Inscription : août 2005
Messages : 1 002
Points : 429
Points : 429
Par défaut 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
__________________
Il y a 10 types de personnes sur la planète. Ceux qui comprennent le binaire et ceux qui ne le comprennent pas...
cyrill.gremaud est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2007, 11h45   #2
Membre Expert
 
Inscription : octobre 2002
Messages : 1 141
Détails du profil
Informations personnelles :
Âge : 32
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : octobre 2002
Messages : 1 141
Points : 1 204
Points : 1 204
Envoyer un message via MSN à Raideman
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.
Raideman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2007, 11h52   #3
Membre Expert
 
Inscription : octobre 2002
Messages : 1 141
Détails du profil
Informations personnelles :
Âge : 32
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : octobre 2002
Messages : 1 141
Points : 1 204
Points : 1 204
Envoyer un message via MSN à Raideman
voici un bout de ma fonction qui gérer ça:

Code :
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.
Raideman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2007, 12h56   #4
Membre éprouvé
 
Homme Cyrill Gremaud
Ingénieur systèmes et réseaux
Inscription : août 2005
Messages : 1 002
Détails du profil
Informations personnelles :
Nom : Homme Cyrill Gremaud
Âge : 23
Localisation : Suisse

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Enseignement

Informations forums :
Inscription : août 2005
Messages : 1 002
Points : 429
Points : 429
merci pour ton aglo dans ton premier post ! je vais étudier tout sa et je te redierai ! merci
__________________
Il y a 10 types de personnes sur la planète. Ceux qui comprennent le binaire et ceux qui ne le comprennent pas...
cyrill.gremaud est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2007, 15h40   #5
Membre éprouvé
 
Homme Cyrill Gremaud
Ingénieur systèmes et réseaux
Inscription : août 2005
Messages : 1 002
Détails du profil
Informations personnelles :
Nom : Homme Cyrill Gremaud
Âge : 23
Localisation : Suisse

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Enseignement

Informations forums :
Inscription : août 2005
Messages : 1 002
Points : 429
Points : 429
re ! je bloque au niveau du calcule en faite... si quelqu'un voit comment je pourrait faire ???

merci

voici mon code pour l'instant :

Citation:
<?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
            
            
if($weightImage $weightMax){
                  
$ratio $weightImage $weightMax;
                  
$newHeight = ($heightImage $ratio) -1;
                  
//la suite ???
            
}
            
      }
      
}else{
      exit(
$image_source_path.' n\'existe pas.');
}
?>
Colorez votre code PHP sur les forums grâce à Developpez.com
__________________
Il y a 10 types de personnes sur la planète. Ceux qui comprennent le binaire et ceux qui ne le comprennent pas...
cyrill.gremaud est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/03/2007, 17h19   #6
Membre Expert
 
Inscription : octobre 2002
Messages : 1 141
Détails du profil
Informations personnelles :
Âge : 32
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : octobre 2002
Messages : 1 141
Points : 1 204
Points : 1 204
Envoyer un message via MSN à Raideman
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 :
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.');
}
?>
Raideman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2007, 19h32   #7
Membre éprouvé
 
Homme Cyrill Gremaud
Ingénieur systèmes et réseaux
Inscription : août 2005
Messages : 1 002
Détails du profil
Informations personnelles :
Nom : Homme Cyrill Gremaud
Âge : 23
Localisation : Suisse

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Enseignement

Informations forums :
Inscription : août 2005
Messages : 1 002
Points : 429
Points : 429
merci pour ton aide ! sa a l'air de marcher mais le truc cest que sa ne m'affiche pas l'image mais plein de texte bizare lol
__________________
Il y a 10 types de personnes sur la planète. Ceux qui comprennent le binaire et ceux qui ne le comprennent pas...
cyrill.gremaud est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2007, 19h37   #8
Membre éprouvé
 
Homme Cyrill Gremaud
Ingénieur systèmes et réseaux
Inscription : août 2005
Messages : 1 002
Détails du profil
Informations personnelles :
Nom : Homme Cyrill Gremaud
Âge : 23
Localisation : Suisse

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Enseignement

Informations forums :
Inscription : août 2005
Messages : 1 002
Points : 429
Points : 429
En faite cest bon j'ai trouver le truc. si on veux simplement afficher l'image on utilise la fonction imagejpeg() de la facon suivante

Code :
1
2
3
 
header ("Content-type: image/jpeg"); 
imagejpeg($imageResize);
Mais il ne faut pas oublier de mettre le header avant !!! Sinon on obtient justement tout ce texte.

Si maintenant comme dans mon cas on veux enregistrer l'image sur le disque, il suffis de faire sa comme sa sans le header

Code :
1
2
 
imagejpeg($imageResize,'images/copy.jpg');
voil ! merci pour votre précieuse aide !
__________________
Il y a 10 types de personnes sur la planète. Ceux qui comprennent le binaire et ceux qui ne le comprennent pas...
cyrill.gremaud est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2007, 19h54   #9
Membre éprouvé
 
Homme Cyrill Gremaud
Ingénieur systèmes et réseaux
Inscription : août 2005
Messages : 1 002
Détails du profil
Informations personnelles :
Nom : Homme Cyrill Gremaud
Âge : 23
Localisation : Suisse

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Enseignement

Informations forums :
Inscription : août 2005
Messages : 1 002
Points : 429
Points : 429
je vous donne quand même le code source !

Citation:
<?php 

/*
REDIMENSIONNEMENT INTELLIGENT

copyright 2007 Cyrill Gremaud (SUISSE)
ce script permet de redimensionner une image avec une taille de base quelquconque
si elle est plus grande que la taille maximale authorisée et prend aussi en compte
le poids maximal de l'image. 

Voici comment le script procède dans l'ordre des choses.

- Check si le fichier existe
- Check le fichier (si c'est bien une image)
- Check le type de l'image (gif, jpg, jpeg, png etc.)
- Ensuite on passe l'image récupérée dans une fonction qui fera les choses suivantes
- -> Récupération de la taille de l'image (imagesx(),imagesy())
- -> Vérification de sa hauteur par rapport à la hauteur maximale autorisée
- -> Si hauteur est ok ,Vérification de sa largeur par rapport à la largeur maximale autorisée
- -> Si c'est pas ok, on copie l'image dans un buffer (createimagefrompng, createimagefromgif etc.) puis on calcule avec une règle de trois les nouvelles dimensions

Exemple:

Largeur Max : 320
Hauteur Max : 240

Taille de l'image : 340 * 240

Problème avec la largeur qui est plus grande que 320. 

nouvelles dimensions :

largeur finale : 320 (anciennement 340)
hauteur finale : X (il faut trouver la bonne taille en fonction de sa nouvelle largeur tout en gardant les même proportions)

Calcule pour trouver hauteur final (X) : (320 * 240)/340 = 226

-ensuite on oublie pas de regarder si l'hauteur est bonne. Si elle est plus grande que le maximum on fais le même calcule
 mais pour trouver la nouvelle largeur.

 

*/

/* 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;
}

/* fonction utile pour checker si l'extension est valide */
function checkExtIsValid($file){
      switch(
$file){ //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;
      }
      return 
$isValid;
}

$image_source_path 'images/image.jpg'//image source
$imageName 'image.jpg';

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
      
$isValid checkExtIsValid($file_type); //on check si le type est valide. autrement dis, si c'est une image
      
      /* on selectionne la fonction a utiliser en fonction de l'extension */
      
if($file_type == 'jpg' or $file_type == 'jpeg'){
            
$imageBuffer imagecreatefromjpeg($image_source_path);
      }elseif(
$file_type == 'gif'){
            
$imageBuffer imagecreatefromgif($image_source_path);
      }elseif(
$file_type == 'png'){
            
$imageBuffer imagecreatefrompng($image_source_path);
      }
      
      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;
                          
//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
                  
$imageResize imagecreatetruecolor(round($newWeight), round($newHeight));
                  
//on copie dedans notre image retaillés
                  
imagecopyresampled($imageResize,$imageBuffer,0,0,0,0,round($newWeight),round($newHeight),$weightImage,$heightImage);
                  
imagejpeg($imageResize,'images/resize/'.$imageName);
        }
}else{
      exit(
$image_source_path.' n\'existe pas.');
}

?>
Colorez votre code PHP sur les forums grâce à Developpez.com

encore merci a tout ceux qui m'ont donné un coup de main !
__________________
Il y a 10 types de personnes sur la planète. Ceux qui comprennent le binaire et ceux qui ne le comprennent pas...
cyrill.gremaud est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h46.


 
 
 
 
Partenaires

Hébergement Web