Tourner un GIF

Mammouth du PHP | 881 Messages

04 sept. 2008, 18:08

Bonjour!

je vous fais part de mes nouveaux essais.
voici maintenant que je traite la chose dans une fenêtre à part, un fichier dédié.

En voici le code:
<?php
	// Fichier et degrés de rotation
	$filename = stripslashes($_GET["Source"]);
	$PartieCommune = "AAA_CeNom_";
	$filename = "images/elements/".$filename;
	$degrees = intval($_GET["Angle"]);
	//echo 'Voici mon message: '.$degrees.'<br>';
	chmod ($filename, 0755);
	
	// Content type
	header('Content-type: image/gif');

	// Chargement
	$source = imagecreatefromgif($filename);

	// Rotation
	for($x=$degrees; $x<360; $x=$x+30) {
		$rotate = imagerotate($source, $x, 0);
//		copy($rotate, "images/elements/".$PartieCommune.$x.".gif");
		// Affichage
		imagegif($rotate);
	}

?>
Cette nouvelle formule résulte en ceci:
L'image [...] ne peut être affichée car elle contient une erreur.
Quelle est l'erreur ?

Merci à l'avance
Soyez artisans de paix

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

04 sept. 2008, 22:04

Bonjour,

Met en commentaire ta ligne
    header('Content-type: image/gif'); 
et tu devrais voir l'erreur (n'oublie pas de décommenter la ligne quand l'erreur sera résolue.
Quand tout le reste a échoué, lisez le mode d'emploi...

Mammouth du PHP | 881 Messages

06 sept. 2008, 05:09

Le problème se décline maintenant en deux parties:
1) comportement erroné de mon serveur LAMP
2) Coloration noire de la transparence originelle.


Voici, les étapes que j'ai suivies.


-------------- Première étape: essai sur le serveur de développement ( Lamp ) --------------------------------------
Voici le message d'erreur que je reçois:
Warning: imagecreatefromgif() [function.imagecreatefromgif]: 'images/elements/Complet_00.gif' is not a valid GIF file in /home/patrick/modem/web/cartes/kayak/Creer_images.php on line 14

Fatal error: Call to undefined function imagerotate() in /home/patrick/modem/web/cartes/kayak/Creer_images.php on line 18
Pourtant, c'est un fichier GIF tout ce qu'il y a de plus ordinaire.

Bon, voilà que ça progresse, j'ai essayé un autre fichier et je n'obtiens que le second message d'erreur:
Fatal error: Call to undefined function imagerotate() in /home/patrick/modem/web/cartes/kayak/Creer_images.php on line 18
Je suis donc encore au même point qu'avant ( http://www.phpfrance.com/forums/viewtop ... highlight= )


Qu'est-ce qui peut différencier mes deux fichiers GIF?
Comment puis-je contrôler cette variable lorsque je reçois de fichiers des visiteurs?

Comment faire avaler ma fonction "imagerotate" ?


Merci à l'avance.


--------------------- Deuxième étape: essai du code sur le serveur internet -------------------

Tout ce qui est ci-haut concerne mon serveur personnel (http://127.0.0.1 sous LAMP )

Un nouveau problème est rencontré par le serveur de mon fournisseur:

L'image qui a un fond transparent (celle téléchargée) et contenu noir voit son contenu pâlir un peu et mis sur un fond noir. Pourtant, je n'ai rien spécifié en dernière variable. Devrais-je?


------------------- Troisième étape: voici le code tel qu'il est rendu sur le serveur internet ---------------------------
 
if ($_POST["Tourner"] == 'oui') {
   $PartieCommune = ($Angle > 100) ? substr($destination_file, 0, strlen($destination_file) - 7) : substr($destination_file, 0, strlen($destination_file) - 6); 
   $source = imagecreatefromgif("images/elements/".$destination_file);
   for($x=$degrees; $x<360; $x=$x+30) {
      $rotate = imagerotate($source, $x, 0);
      $val = ($x==0) ? "00" : $x;
      $NomSortie = "images/elements/".$PartieCommune.$val.".gif";
      imagegif($rotate, $NomSortie);
      echo 'Enregistrement de '.$PartieCommune.$val.'.gif</br>';
   }
}
=============================== Au final ===========================

deux questions:
1) Comment débloquer mon serveur de développement ?
2) Comment conserver la transparence dans mes dessins ?


Merci
Soyez artisans de paix

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

06 sept. 2008, 08:18

Bon, voilà que ça progresse, j'ai essayé un autre fichier et je n'obtiens que le second message d'erreur:
Fatal error: Call to undefined function imagerotate() in /home/patrick/modem/web/cartes/kayak/Creer_images.php on line 18
Je suis donc encore au même point qu'avant ( http://www.phpfrance.com/forums/viewtop ... highlight= )
cf doc:
Note: This function is only available if PHP is compiled with the bundled version of the GD library.
Si tu n'as pas la fonction imagerotate() c'est que tu n'as pas la bonne version de GD. Ubuntu par exemple n'inclut volontairement pas la bonne lib GD...

Voici quelques solution qui sont en commentaires de la doc:
For those using Ubuntu, if you have permission to access your PHP modules directory, you can snag a bundled php-gd.so from another distribution (such as Red Hat or Mandriva) and replace yours, and you should be good to go (I was).
ou en refaisant la fonction imagerotate "à la mano" : http://php.mainseek.com/manual/en/funct ... .php#73193
Quand tout le reste a échoué, lisez le mode d'emploi...

Mammouth du PHP | 881 Messages

06 sept. 2008, 14:35

Merci beaucoup.

J'avais lu la doc, mais je n'ai jamais vu les specs pour Ubuntu :oops:


Quant à la transparence, j'ai dû miser sur le bleu pour simuler de la transparence. Je profite du fait que que image seront utilisées sur un fond bleu. C'est une hypothèse fragile et non transférable, mais dans mon cas, elle fonctionne. Voici donc mon code final. Ceci donne un fond blanc plutôt que noir. Ça change quelque chose, mais ce n'est pas encore plus utile.

Avez-vous une idée????
if ($_POST["Tourner"] == 'oui') {
     $PartieCommune = ($Angle > 100) ? substr($destination_file, 0, strlen($destination_file) - 7) : substr($destination_file, 0, strlen($destination_file) - 6); 
     $source = imagecreatefromgif("images/elements/".$destination_file);
     $BleuAqueux = imagecolorallocate($source, 0, 0, 255);
     imagecolortransparent($source, $BleuAqueux);
     $degrees = $degrees + 30;
     for($x=$degrees; $x<360; $x=$x+30) {
          $rotate = imagerotate($source, $x,  imagecolorat($source, 0,0));
          $val = ($x==0) ? "00" : $x;
          $NomSortie = "images/elements/".$PartieCommune.$val.".gif";
          imagegif($rotate, $NomSortie);
          echo 'Enregistrement de '.$PartieCommune.$val.'.gif</br>';
     }
}
>>>>>> Voici la démarche que j'ai suivie >>>>>>>>>>

Avez-vous une piste aussi bonne pour le changement de couleur des fonds transparents? Je crains mal comprendre la doc à ce sujet. Est-ce qu'il faut que je mette un 4e paramètre ou non? Si oui, quelle valeur y mettre?

On parle ici http://php.mainseek.com/manual/en/funct ... .php#64531 de PNG, je vais tenter avec le gif. On dit de passer -1 en troisième paramètre. J'ai essayé et j'ai obtenu un résultat un peu étonnant: ce qui était transparent est devenu noir; l'espace créé en bordure (par la rotation) est devenu turquoise. C'est beau, mais ce n'est pas ce que je veux. Bref, il faut trouver autre chose. ---- J'essaie ceci


Merci encore.http://php.mainseek.com/manual/en/funct ... .php#52288 qui mise sur un pixel transparent en 0,0. C'est une loterie qui peut fonctionner souvent, mais pas à tous les coups. J'aimerais quelque chose de plus fiable. Toujours autant de noir.

Se pourrait-il que ImageCreateFromGif ne respecte pas la transparence?
Soyez artisans de paix