Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > Images > Imagick
Imagick Forum d'entraide pour l'extension Imagick permettant de manipuler des images en PHP (port de l'API ImageMagick).
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 26/06/2007, 23h59   #1
Invité de passage
 
Inscription : août 2005
Messages : 16
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 16
Points : 2
Points : 2
Par défaut [ImageMagick] Problème de génération image

Bonjour à tous,

je me permets de poster sur le forum car je n'arrive pas à résoudre mon problème malgré de nombreuses recherches.

J'ai l'erreur suivante (connue et reconnue) lorsque je veux créer une image :
L'image “...” ne peut être affichée car elle contient des erreurs.

Ceci est du au fait que je me plante quelque part lorsque je déclare header("Content-type: image/png")
Pour plus de prévisions, j'utilise la méthode MVC pour développer mon appli et voici une partie du code :

Mon controleur :
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
 
<?php
require_once('test.php');
require_once('VUE_projet.php');
require_once('MOD_projet.php');
require_once('./Ressources/Objets/requeteBD.php');
class CTRL_projet{
	function CTRL_projet($etape){
// .. .//
$this -> Test = new Test();
// ... //
if ($num_utilisateur == 1 && $num != 0 && ($detail != '' || $detail != 'liste')) {
					$detail = array();
					$detail_projet = $this -> requeteBD -> detailProjet($num);
					$categorie_mere = $this -> requeteBD -> categorieMere($num);
					$nb_etape_projet = $this -> requeteBD -> nbEtape($num);
					$etape_projet = $this -> requeteBD -> etapeProjet($num);
					$nb_etape_fini = $this -> requeteBD -> nbEtapeFini($num);
					foreach ($nb_etape_projet as $nbe) {
						foreach ($nb_etape_fini as $nbf) {
									header("Content-type: image/png");
									$graphe = $this -> Test -> graphique($nbe['cpte'], $nbf['cpte']);
						}
					}
					foreach ($detail_projet as $det) {
						foreach ($categorie_mere as $cat) {
							foreach ($nb_etape_projet as $nbe) {
									$_SESSION['nom_projet'] = $det['nom_projet_'];
									array_push($detail, array('nom_projet_'=>$det['nom_projet_'], 'nom_'=>$det['nom_'], 'prenom_'=>$det['prenom_'], 'libelle_'=>$det['libelle_'], 'date_debut_'=>$det['date_debut_'], 'date_fin_'=>$det['date_fin_'], 'libelle_categorie_'=>$cat['libelle_'], 'cpte_'=>$nbe['cpte']));
									$duree = $this -> MOD_global -> duree($det['date_debut_'], $det['date_fin_']);
							}
						}
					}
					//print_r($detail);
					new VUE_projet(2, $detail, $etape_projet, $duree, $graphe);
				}
La classe Test (c'est pas encore fini, alors faut pas s'étonner de ce que ca fait)
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
 
<?php
class Test {
	function Test() {}
 
	function graphique($nb_etape, $nb_fini) {
		$nb_encours = $nb_etape - $nb_fini;
		$image = @imagecreatetruecolor(200,10) or die ('Il y a un probl&egrave;me');
		$rouge = imagecolorallocate($image, 255, 0, 0);
		$vert = imagecolorallocate($image, 0, 255, 0);
		imagefill($image, 0, 10, $rouge);
		for ($i = 0; $i < $nb_etape; $i++) {	
			if ($nb_fini >= 1) {
				$src = imagecreatefrompng("./Ressources/images/prog_vert.png");
				$temp = imagecreatetruecolor(200,11);
				for ($j = 0; $j < $nb_fini; $j++) {
					imagecopy ($temp, $src, 0, 0, $j * (200/$nb_etape)/$nb_fini, (200/$nb_etape)/$nb_fini, 200, 11);
					//imagefill($image, $j * (200/$nb_etape)/$nb_fini, (200/$nb_etape)/$nb_fini, $vert);
				}
			}
 
			$src = @imagecreatefrompng("./Ressources/images/prog_rouge.png");
			$temp = @imagecreatetruecolor(200,11);
			for ($k = 0; $k < $nb_encours; $k++) {
				imagecopy ($temp, $src, 0, 0, $k * (200/$nb_etape)/$nb_encours, (200/$nb_etape)/$nb_encours, 200, 11);
				//imagefill($image, 0, 10, $rouge); //$k * (200/$nb_etape)/$nb_encours, (200/$nb_etape)/$nb_encours, $rouge);
			}
		imagedestroy($temp);
		}
		//header ("Content-type: image/png");
		imagepng($src);
		//return $src;
 
		//header ("Content-type: image/png");
		//$img = graphique(1,1);
		//imagepng($img);
		//imagepng($image);
		//imagedestroy($image);
	}
}
?>
La fonction graphique, testée seule dans un fichier à part (et ca marche)
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
 
function graphique($nb_etape, $nb_fini) {
		$nb_encours = $nb_etape - $nb_fini;
		$image = @imagecreatetruecolor(200,10) or die ('Il y a un probl&egrave;me');
		$rouge = imagecolorallocate($image, 255, 0, 0);
		$vert = imagecolorallocate($image, 0, 255, 0);
		imagefill($image, 0, 10, $rouge);
		for ($i = 0; $i < $nb_etape; $i++) {	
			if ($nb_fini >= 1) {
				$src = imagecreatefrompng("../Ressources/images/prog_vert.png");
				$temp = imagecreatetruecolor(200,11);
				for ($j = 0; $j < $nb_fini; $j++) {
					imagecopy ($temp, $src, 0, 0, $j * (200/$nb_etape)/$nb_fini, (200/$nb_etape)/$nb_fini, 200, 11);
					//imagefill($image, $j * (200/$nb_etape)/$nb_fini, (200/$nb_etape)/$nb_fini, $vert);
				}
			}
 
			$src = @imagecreatefrompng("../Ressources/images/prog_rouge.png");
			$temp = @imagecreatetruecolor(200,11);
			for ($k = 0; $k < $nb_encours; $k++) {
				imagecopy ($temp, $src, 0, 0, $k * (200/$nb_etape)/$nb_encours, (200/$nb_etape)/$nb_encours, 200, 11);
				//imagefill($image, 0, 10, $rouge); //$k * (200/$nb_etape)/$nb_encours, (200/$nb_etape)/$nb_encours, $rouge);
			}
		imagedestroy($temp);
		}
 
	}
header ("Content-type: image/png");
$img = graphique(1,1);
imagepng($img);
Merci pour votre aide
bebert_2002 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2007, 09h50   #2
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Salut

Cette erreur arrive fréquemment lorsque PHP affiche un warning ou une erreur, car cela se mélange à la sortie et donc le navigateur a du mal à différencier le warning de l'image

Une première solution de diagnostic est de mettre un appel à exit; juste avant l'appel à la fonction d'affichage de l'image (ici : imagepng).
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2007, 10h03   #3
Invité de passage
 
Inscription : août 2005
Messages : 16
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 16
Points : 2
Points : 2
Merci pour ta réponse,

J'ai fait un appel à exit; comme tu me l'as suggéré, avant la création de l'image, j'ai toujours le même message ""...L'image contient des erreurs", je le fais avant le header, comme le header n'est pas modifié, du coup je n'ai plus du tout d'affichage.

Je vais essayer en utilisant une image jpeg, car apparemment, lorsque je change le header en mettant comme argument "Content-type: image/jpeg", la génération essaie d'être faite mais elle n'aboutit pas (certainement parce que la source est une image png), je regarde ca et je te tien au courant,

merci
bebert_2002 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2007, 10h13   #4
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Si tu as une page blanche, c'est que la tentative de débogage est infructueuse, ma suggestion n'est pas la bonne.

Ok, pigé.

En réalité, tu essaies d'envoyer plusieurs images à la fois : c'est impossible. Pense bien que le résultat d'un script est compris par le navigateur comme étant UN document, tu ne peux donc pas envoyer différents documents même s'ils sont du même type.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2007, 10h34   #5
Invité de passage
 
Inscription : août 2005
Messages : 16
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 16
Points : 2
Points : 2
J'ai complètement changer la façon de générer l'image, je le fais avec la fonction imagecreatejpeg (comme je te l'ai dit plus haut c'était pour voir la réaction du serveur), et cette fois ci, au lieu de créer l'image à partir du contrôleur, je le fais directement dans la vue, fichier test.php ne change pas, par contre dans mon fichier VUE_....php j'ai rajouté ceci :
Code :
1
2
 
$vue_projet .=	"<td colspan=\"4\"><img src=\"".$graphe = $this -> Test -> graphique(1,1)."\"></img></td>\n";
Apres un petit peu de débogage (des warning s'affichaient dans l'affichage de la source), je n'ai toujours pas d'image mais j'ai l'url de la page depuis laquelle est appelé l'image en affichage, et dans l'affichage de la source, j'ai une série de caractère juste après l'ouverture de la balise <body>.
Et j'oubliais, la balise <img src=""> est vide.
bebert_2002 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2007, 10h46   #6
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Afin d'être sur la même longueur d'ondes : dans la balise <img src=""/>, tu indiques bien le nom du script chargeant l'image ?
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2007, 10h50   #7
Invité de passage
 
Inscription : août 2005
Messages : 16
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 16
Points : 2
Points : 2
oui tout à fait, d'ailleurs dans le code que j'ai envoyé ci-dessus, je e suis trompé, ce n'est pas $ graphe = ... , mais directement $this -> Test -> graphique(1, 1)
bebert_2002 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2007, 11h02   #8
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Cette méthode n'ayant pas de valeur de retour, je comprends que l'utiliser dans echo pose des problèmes
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2007, 11h25   #9
Invité de passage
 
Inscription : août 2005
Messages : 16
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 16
Points : 2
Points : 2
Alors comment dois-je faire pour procéder s'il-te-plaît
bebert_2002 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2007, 11h43   #10
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Dans la page HTML, tu devrais obtenir quelque chose comme :
Code HTML :
<img src="image.php?parametres" alt="image dynamique"/>

Dans image.php :
Code :
1
2
3
4
5
<?php
//traitements...
header('Content-type: image/png');
imagepng($handle);
?>
Si tu utilises le pattern MVC, tu as donc au moins 2 types d'action :
  • Afficher un document (page Web)
  • Afficher une image (image.php)
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2007, 11h48   #11
Invité de passage
 
Inscription : août 2005
Messages : 16
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 16
Points : 2
Points : 2
Je te remercie beaucoup pour ton aide, ca me semble nettement plus clair et plausible d'agir de cette manière, dès que j'ai le temps dans la journée, je teste et je te dis comment ca se passe, en tout cas, merci
bebert_2002 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2007, 14h53   #12
Invité de passage
 
Inscription : août 2005
Messages : 16
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 16
Points : 2
Points : 2
Bon ben ca marche comme sur des roulettes, je te remercie pour l'aide
bebert_2002 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 22h46.


 
 
 
 
Partenaires

Hébergement Web