[PHP-GD] Impossible de sauver l'image

Impossible de sauver l'image [PHP-GD] - PHP - Programmation

Marsh Posté le 02-03-2004 à 14:09:41    

Je me suis fait un script pour taguer une image.
Le problème, c'est que si j'essayes de sauver l'image tagué sur le disque du serveur, j'obtiens un fichier vide et le navigateur revoit le message  
Warning: imagejpeg() [function.imagejpeg]: gd-jpeg: JPEG library reports unrecoverable error: in /www/torrent/tehanu/tag/tag.php5 on line 120 (en utilisant imagejpeg).
J'ai le même probléme avec les fonctions imagepng et imagegif.(pas encore testé imagewbmp)
 
Par contre, le même code mais en renvoyant l'image au navigateur fonctionne trés bien sans aucune erreur.
 
Autre détail, un fopen avec écriture dans le fichier focntionne trés bien, donc le probléme n'a pas l'air d'être du à un probléme de droit d'acccés.
 
liste des versions :
Apache Version  Apache/2.0.48 (Unix) PHP/5.0.0a5-alexdupre
PHP Version 5.0.0a5-alexdupre
 
gd
GD Support : enabled
GD Version : bundled (2.0.17 compatible)
FreeType Support : enabled
FreeType Linkage : with freetype
FreeType Version : 2.1.5
T1Lib Support : enabled
GIF Read Support : enabled
GIF Create Support : enabled
JPG Support : enabled
PNG Support : enabled
WBMP Support : enabled
XPM Support : enabled
XBM Support : enabled
JIS-mapped Japanese Font Support : enabled
 
 
 
S'il faut d'autres infos, je les donerais. ;)
Merci d'avance pour ceux qui se pencheront sur mon probléme. :)

Reply

Marsh Posté le 02-03-2004 à 14:09:41   

Reply

Marsh Posté le 02-03-2004 à 14:13:17    

Je crois que c'est un bug lié à ta version de GD (mais j'en suis pas sûr). Il me semble me souvenir que qqu a eu le cas ici avec une version très récente de GD.

Reply

Marsh Posté le 02-03-2004 à 14:20:58    

Zut.
Il y aurait pas un moyen de contourner le probléme?
Peut être en interceptant la sortie standard et la renvoyant vers un fichier?
Vu que j'ai jamais testé une telle interception, je sais pas si c'est faisable directement en php.
 
EDIT : c'est bon, j'ai trouvé comment faire :
ob_start
ob_get_contents
copie du contenu de la variable dans un fichier
ob_end_clean (si on veut pas envoyer l'image au navigateur)
ob_end_flush
Enfin a mon avis, ca  doit être faisable comme ça, me reste a tester.


Message édité par omega2 le 02-03-2004 à 14:27:04
Reply

Marsh Posté le 02-03-2004 à 14:25:44    

omega2 a écrit :

Zut.
Il y aurait pas un moyen de contourner le probléme?
Peut être en interceptant la sortie standard et la renvoyant vers un fichier?
Vu que j'ai jamais testé une telle interception, je sais pas si c'est faisable directement en php.


 
Tu es vraiment sûr que tu n'as pas (enfin que php) n'a pas de problèmes de droit ?? C'est quand même très bizarre... Et pourtant tu disais que tu peux faire un fopen...  :heink:  
 
Tu peux montrer juste la ligne de code avec ton imagejpeg et surtout l'adresse d'écriture ?  
 

Reply

Marsh Posté le 02-03-2004 à 14:36:27    

hermes le messager a écrit :


 
Tu es vraiment sûr que tu n'as pas (enfin que php) n'a pas de problèmes de droit ?? C'est quand même très bizarre... Et pourtant tu disais que tu peux faire un fopen...  :heink:  
 
Tu peux montrer juste la ligne de code avec ton imagejpeg et surtout l'adresse d'écriture ?  
 
 


Code :
  1. <?php
  2. $imgname="img.jpg";
  3. $destname="final.png";
  4. tag4($imgname,$destname);
  5. function tag4($imgname,$tagname,$destname)
  6. { $Im = imagecreatefromjpeg($imgname); /* Tentative d'ouverture */
  7.   if ($Im) /* Vérification */
  8.   { // génération du tag
  9. $TailleX=imagesx($Im);
  10.     $TailleY=imagesy($Im);
  11. $ImTag=imgtagG();
  12.     if ($ImTag) /* Vérification */
  13.     { // on ajoute le tag dans l'image
  14.       $TailleTagX=imagesx($ImTag);
  15.       $TailleTagY=imagesy($ImTag);
  16.    imagecopymerge($Im,$ImTag,0,0,0,0,$TailleTagX,$TailleTagY,100);
  17.       imagecopymerge($Im,$ImTag,$TailleX-$TailleTagX,$TailleY-$TailleTagY,0,0,$TailleTagX,$TailleTagY,100);
  18.   imagedestroy($ImTag);
  19.     }else
  20. { echo "tag non ouvert (".$tagname." )";
  21. }
  22. $ImTag=imgtagD();
  23.     if ($ImTag) /* Vérification */
  24.     { // on ajoute le tag dans l'image
  25.       $TailleTagX=imagesx($ImTag);
  26.       $TailleTagY=imagesy($ImTag);
  27.    imagecopymerge($Im,$ImTag,$TailleX-$TailleTagX,0,0,0,$TailleTagX,$TailleTagY,100);
  28.       imagecopymerge($Im,$ImTag,0,$TailleY-$TailleTagY,0,0,$TailleTagX,$TailleTagY,100);
  29.   imagedestroy($ImTag);
  30.     }else
  31. { echo "tag non ouvert (".$tagname." )";
  32. }
  33. //imageinterlace($Im,1);
  34.     imagejpeg($Im,$destname,100); //l'erreur est là
  35. //header("Content-type: image/jpeg" );
  36. //imagejpeg($Im);
  37. imagedestroy($Im);
  38.   }else
  39.   { echo "image non ouverte (".$imgname." )";
  40.   }
  41. }
  42. function imgtagD()
  43. { return imgtag(1);
  44. }
  45. function imgtagG()
  46. { return imgtag(2);
  47. }
  48. function imgtag($pos)
  49. { if ($pos==1)
  50.   { $angle=338;
  51.     $haut=25;
  52.     $gauche=4;
  53.   }else
  54.   { $angle=22;
  55.     $haut=125;
  56.     $gauche=12;
  57.   }
  58.   $ImTag = imagecreate(252, 132); /* Tentative d'ouverture */
  59.   if ($ImTag) /* Vérification */
  60.   { // on définit le tag en question
  61.     $TailleTagX=imagesx($ImTag);
  62.     $TailleTagY=imagesy($ImTag);
  63. $color3=imagecolorallocate($ImTag, 255, 255, 255);
  64. $color2=imagecolorallocate($ImTag, 255, 255, 0);
  65. $color=imagecolorallocate($ImTag, 0, 0, 255);
  66. imagecolortransparent ($ImTag,$color3);
  67. imagefill ($ImTag,0,0,$color3);
  68. imagettftext($ImTag, 35, $angle, $gauche ,$haut ,$color , "./police/wendymed.ttf",'mon texte');
  69. // on enléve les effets de flous
  70. for ($PosX=0;$PosX<$TailleTagX;$PosX++)
  71. { for ($PosY=0;$PosY<$TailleTagY;$PosY++)
  72.   { if (imagecolorat ($ImTag,$PosX,$PosY)<>$color3)
  73.  {  imagesetpixel($ImTag,$PosX-$i,$PosY-$j,$color);
  74.  }
  75.   }
  76. }
  77. // on rajoute la bordure
  78. for ($PosX=0;$PosX<$TailleTagX;$PosX++)
  79. { for ($PosY=0;$PosY<$TailleTagY;$PosY++)
  80.   { if (imagecolorat ($ImTag,$PosX,$PosY)==$color)
  81.  { for ($i=1;$i<=4;$i++)
  82.       { for ($j=1;$j<=4-$i;$j++)
  83.         { if (imagecolorat($ImTag,$PosX-$i,$PosY-$j)==$color3)
  84.     { imagesetpixel($ImTag,$PosX-$i,$PosY-$j,$color2);
  85.           }
  86.               if (imagecolorat($ImTag,$PosX+$i,$PosY-$j)==$color3)
  87.     { imagesetpixel($ImTag,$PosX+$i,$PosY-$j,$color2);
  88.           }
  89.             }
  90.    }
  91.    for ($i=1;$i<=4;$i++)
  92.       { for ($j=1;$j<=4-$i;$j++)
  93.         { if (imagecolorat($ImTag,$PosX-$i,$PosY+$j)==$color3)
  94.     { imagesetpixel($ImTag,$PosX-$i,$PosY+$j,$color2);
  95.           }
  96.               if (imagecolorat($ImTag,$PosX+$i,$PosY+$j)==$color3)
  97.     { imagesetpixel($ImTag,$PosX+$i,$PosY+$j,$color2);
  98.           }
  99.   }
  100.    }
  101.     }
  102.   }
  103. }
  104.   }
  105.   return $ImTag;
  106. }
  107. ?>

ligne de code en errreur :
imagejpeg($Im,$destname,100);  
message d'erreur :
Warning: imagejpeg() [function.imagejpeg]: gd-jpeg: JPEG library reports unrecoverable error: in /www/torrent/tehanu/tag/tag.php5 on line 34  
  (le numéro de ligne a changé par ce que j'ai enlever mes anciens tests du fichier que j'ai copié)
 
Heu, tu veux dire quoi par l'adresse d'écriture? Je la trouve où cette info?
Quand aux droit d'accés,  j'ai vérifié, les différents répertoires menant à celui où le script est exécuté (et où le fichier final est donc censé être sauvegardé) sont tous en rwx pour tous (le propriétaire, son groupe et les autres) Donc, il devrait pas y avoir de probléme d'accés à ce niveau. ;)

Reply

Marsh Posté le 02-03-2004 à 14:41:51    

Ok, voilà ce que tu vas faire.
 
Contente toi d'écrire un minuscule script avec seulement la lecture et la réécriture d'une image.
 
Et vois si l'erreur est toujours présente. ;)

Reply

Marsh Posté le 02-03-2004 à 14:45:18    

Code :
  1. <?php
  2. $imgname="img.jpg";
  3. $destname="final.jpg";
  4. test($imgname,$destname);
  5. //tag4($imgname,$destname);
  6. function test($imgname,$destname)
  7. { $Im = imagecreatefromjpeg($imgname);
  8.   if ($Im) /* Vérification de l'ouverture */
  9.   { imagejpeg($Im,$destname,100);
  10. imagedestroy($Im);
  11.   }
  12. }
  13. ?>


Résultat :
Warning: imagejpeg() [function.imagejpeg]: gd-jpeg: JPEG library reports unrecoverable error: in /www/torrent/tehanu/tag/tag.php5 on line 9


Message édité par omega2 le 02-03-2004 à 14:46:11
Reply

Marsh Posté le 02-03-2004 à 14:49:01    

omega2 a écrit :

Code :
  1. <?php
  2. $imgname="img.jpg";
  3. $destname="final.jpg";
  4. test($imgname,$destname);
  5. //tag4($imgname,$destname);
  6. function test($imgname,$destname)
  7. { $Im = imagecreatefromjpeg($imgname);
  8.   if ($Im) /* Vérification de l'ouverture */
  9.   { imagejpeg($Im,$destname,100);
  10. imagedestroy($Im);
  11.   }
  12. }
  13. ?>


Résultat :
Warning: imagejpeg() [function.imagejpeg]: gd-jpeg: JPEG library reports unrecoverable error: in /www/torrent/tehanu/tag/tag.php5 on line 9


 
Fais cela en dehors d'une fonction.

Reply

Marsh Posté le 02-03-2004 à 14:55:42    

Code :
  1. <?php
  2. $Im = imagecreatefromjpeg("img.jpg" ); /* Tentative d'ouverture */
  3. if ($Im) /* Vérification */
  4. { imagejpeg($Im,"final.jpg",100);
  5. imagedestroy($Im);
  6. }
  7. ?>

Warning: imagejpeg() [function.imagejpeg]: gd-jpeg: JPEG library reports unrecoverable error: in /www/torrent/tehanu/tag/tag.php5 on line 4
 
J'aurais quand même était particuliérement étoné que ca ne marche qu'en dehors des fonctions. ;)

Reply

Marsh Posté le 02-03-2004 à 14:58:41    

omega2 a écrit :

Code :
  1. <?php
  2. $Im = imagecreatefromjpeg("img.jpg" ); /* Tentative d'ouverture */
  3. if ($Im) /* Vérification */
  4. { imagejpeg($Im,"final.jpg",100);
  5. imagedestroy($Im);
  6. }
  7. ?>

Warning: imagejpeg() [function.imagejpeg]: gd-jpeg: JPEG library reports unrecoverable error: in /www/torrent/tehanu/tag/tag.php5 on line 4
 
J'aurais quand même était particuliérement étoné que ca ne marche qu'en dehors des fonctions. ;)


 
Moi aussi, mais au moins, si tu ax la certitude que ton dossier a les bons droits, tu sais maintenant ASSUREMENT qu'il y a un problème avec ta version de GD (voire PHP)...
 
Essaye de faire exactement la même chose avec une autre version de php/gd si tu peux. Si tu n'a plus l'erreur, tu sauras donc exactement d'où ça vient.

Reply

Marsh Posté le 02-03-2004 à 14:58:41   

Reply

Marsh Posté le 02-03-2004 à 15:12:10    

Le problème, c'est que j'ai tout installé a partir des ports de freebsd ce qui veut dire que si je veux installer une autre version, il faut que j'ailles la chercher sur le net et je perds alors la gestion des mises à jours sans compter que d'autres ports pouraiente refuser de s'installer a cause des dépendances. :(
Pour le moment, je vais contourner le probléme et ensuite, quand le bug sera corrigé, j'utiliserais la fonction comme indiqué dans la doc. ;)

Reply

Marsh Posté le 02-03-2004 à 15:16:19    

omega2 a écrit :

Le problème, c'est que j'ai tout installé a partir des ports de freebsd ce qui veut dire que si je veux installer une autre version, il faut que j'ailles la chercher sur le net et je perds alors la gestion des mises à jours sans compter que d'autres ports pouraiente refuser de s'installer a cause des dépendances. :(
Pour le moment, je vais contourner le probléme et ensuite, quand le bug sera corrigé, j'utiliserais la fonction comme indiqué dans la doc. ;)


 
Ok ! Bon courage, mais à mon avis, c'est bien un bug de GD. ;)

Reply

Marsh Posté le 02-03-2004 à 15:21:00    

Fort possible. C'est pour ça qu'il aut que je contourne le bug en attendant qu'il soit corrigé. ;)
Du coup, maintenant, je vais apprendre à faire joujou avec les buffers. ;)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed